GPIOドライバルーチンのMTK6737プラットフォーム(A)

1、/kernel-3.18/arch/arm64/boot/dts/mt6735.dtsiで、DTSファイル内のノードを作成します

デバイスノード名を作成Mygpio、一致する名前「mykgpio」。

2、駆動フレームを書きません

#include <linuxの/ slab.h>
の#include <linuxの/ device.h>
の#include <linuxの/ miscdevice.h>
の#include <linuxの/ device.h>
の#include <linuxの/ uaccess.h>
の#include <linuxの/ fb.h>
の#include <linuxの/ init.h>
の#include <linuxの/ module.h>
の#include <linuxの/ kernel.hを>
する#include </生成をautoconf.h>
の#include <linuxの/ platform_device.h>
# <linux / fs.h>含む
の#include <linuxの/ ioctl.h>
の#include <linuxの/ types.h>に
する#include <linuxの/ spinlock.h>
の#include <linuxの/ cdev.h>
の#include <ASM / uaccess .h>
の#include <ASM / io.h>
の#include <ASM / atomic.h>

#include "MT-PLAT / mtgpio.h"
の#include <linuxの/ types.h>に
する#include <MT-PLAT / mt_gpio.h>
の#include <MT-PLAT / mt_gpio_core.h>
の#include <マッハ/ gpio_const.h >

/ *生命函数定义* /
静的INT mygpio_probe(構造体platform_device * PDEV)。
静的int型mygpio_remove(構造体platform_device * PDEV)。


静的定数構造体of_device_id mygpio_of_match [] = {
    {.compatible = "mykgpio"}、
    {}、
}。

静的構造体platform_driverのmygpio_driver = {
    .remove = mygpio_remove、
    .probe = mygpio_probe、
    .driver = {
            .nameの= "myGPIO"、
            .owner = THIS_MODULE、
            .of_match_table = mygpio_of_match、
    }、
}。

静的INT mygpio_misc_open(構造体iノード* iノード、構造体のファイル*ファイル)
{
    のprintk( "MyGPIOオープン\ Rを\ n");
    
    0を返します。
}


静的int型mygpio_misc_release(構造体のinode * iノード、構造体ファイル*ファイル)
{
    のprintk( "MyGPIOリリース\ rをする\ nを。");
    
    0を返します。
}

静的長いmygpio_unlocked_ioctl(構造体ファイル*ファイル、unsigned int型CMD、unsigned long型のarg)
{
    のprintk( "MyGPIOのioctl \ Rを\ n");
    
    printk( "MyGPIO CMD =%D \ Rを\ n"、CMD)。
    
    0を返します。
}

静的定数構造体file_operationsのmygpio_fops = {
 / * .owner = THIS_MODULE、* /
    .open = mygpio_misc_open、
    .release = mygpio_misc_release、
    .unlocked_ioctl = mygpio_unlocked_ioctl、
}。


静的構造体miscdeviceのmygpio_misc_device = {
    .minor = MISC_DYNAMIC_MINOR、//动态设备号
    .nameの= "myGPIO"、
    .fops =&mygpio_fops、
}。

/ *マイGPIOプローブ* /
静的INT mygpio_probe(構造体platform_device * PDEV)
{
    int型RET = 0。
    
    printk( "MyGPIOプローブ\ Rを\ n");
    
    RET = misc_register(&mygpio_misc_device)。
    (もし!RET = 0)
        のprintk( "myGPIO:mygpio_deviceレジスタは失敗しました\ n");
    
    RETを返します。
}


静的INT mygpio_remove(構造体platform_device * PDEV)
{
    int型ERR。
    
    printk( "MyGPIO削除\ Rを\ n");

    ERR = misc_deregister(&mygpio_misc_device)。
    もし(ERR)
        のprintk( "GPIOの\ nを登録解除");
    
    ERRを返します。
}

静的INT __init my_gpio_init(ボイド)
{
    int型RET = 0。

    printk( "登録MyGPIO platform_driver \ rをする\ nを。");

    RET = platform_driver_register(&mygpio_driver)。
    (もし!RET = 0)
        のprintk( "MyGPIOドライバを登録することができませんでし\ nは。");
    
    RETを返します。
}

/ * ------------------------------------------------ --------------------------- * /
静的ボイド__exitのmy_gpio_exit(ボイド)
{
    platform_driver_unregister(&mygpio_driver)。
}

subsys_initcall(my_gpio_init)。
/ * module_init(my_gpio_init); * /
module_exit(my_gpio_exit)。

MODULE_AUTHOR( "Zue、");
MODULE_DESCRIPTION( "MY汎用ドライバ(GPIO)");
MODULE_LICENSE( "GPL v2の");
このプロセスは非常に簡単で、最初のデバイスドライバを登録するとき"mykgpio"の名前にマッチしたDTSデバイスは、プローブ機能にプローブ機能が呼び出されたときに、「myGPIO」その他のデバイスドライバの名前は登録してください。

カーネルにドライバファイル、コンパイルしてミラーをコンパイルあまり書きます。

開発ボードを開始した後、あなたは/ devディレクトリに登録されたデバイスを見ることができます。このような枠組みはOK、ここにあなたがGPIOドライバの物質を書くことができるドライブです。

おすすめ

転載: blog.csdn.net/u010783226/article/details/93378450