GPIO的驱动模型

来源:互联网 发布:淘宝店铺装修怎么做 编辑:程序博客网 时间:2024/05/18 08:38
  1. 原文地址:GPIO的驱动模型 作者:wangbaolin719


  2. 一、概述
  3. GPIO是嵌入式系统最简单、最常用的资源了,比如点亮LED,控制蜂鸣器,输出高低电平,检测按键,等等。GPIO分输入和输出,在davinci linux中,有关GPIO的最底层的寄存器驱动,\arch\arm\mach-davinci目录下的gpio.c,这个是寄存器级的驱动,搞过单片机MCU的朋友应该比较熟悉寄存器级的驱动。

  4. GPIO的驱动主要就是读取GPIO口的状态,或者设置GPIO口的状态。就是这么简单,但是为了能够写好的这个驱动,在LINUX上作了一些软件上的分层。为了让其它驱动可以方便的操作到GPIO,在LINUX里实现了对GPIO操作的统一接口,这个接口实则上就是GPIO驱动的框架,具体的实现文件为gpiolib.c在配置内核的时候,我们必须使用CONFIG_GENERIC_GPIO这个宏来支持GPIO驱动。

  5. GPIO是与硬件体系密切相关的,linux提供一个模型来让驱动统一处理GPIO,即各个板卡都有实现自己的gpio_chip控制模块:request, free, input,output, get,set,irq...然后把控制模块注册到内核中,这时会改变全局gpio数组:gpio_desc[]. 当用户请求gpio时,就会到这个数组中找到,并调用这个GPIO对应的gpio_chip的处理函数。gpio实现为一组可用的 gpio_chip, 由驱动传入对应 gpio的全局序号去 request, dataout ,datain, free. 这时会调用gpio_chip中具体的实现。
  6. gpio是一组可控件的脚,由多个寄存器同时控制。通过设置对应的寄存器可以达到设置GPIO口对应状态与功能。数据状态,输入输出方向,清零,中断(那个边沿触发), 一般是一组(bank)一组的。
  7. 寄存器读写函数: __raw_writel() __raw_writeb() __raw_readl() __raw_readb()

  8. 二、linux 中GPIO模型的结构
  9. //表示一个gpio口,含对应的gpio_chip.
  10. //对于每一个gpio,都有一个gpio描述符,这个描述符包含了这个gpio所属的控制器即chip和一些标志,label等
  11. struct gpio_desc {
  12.     struct gpio_chip    *chip;
  13.     unsigned long    flags;
  14.     /* flag symbols are bit numbers */
  15.     #define FLAG_REQUESTED 0
  16.     #define FLAG_IS_OUT 1
  17.     #define FLAG_RESERVED 2
  18.     #define FLAG_EXPORT 3 /* protected by sysfs_lock */
  19.     #define FLAG_SYSFS 4 /* exported via /sys/class/gpio/control */
  20.     #define FLAG_TRIG_FALL 5 /* trigger on falling edge */
  21.     #define FLAG_TRIG_RISE 6 /* trigger on rising edge */
  22.     #define FLAG_ACTIVE_LOW 7 /* sysfs value has active low */
  23.     #define FLAG_OPEN_DRAIN 8 /* Gpio is open drain type */
  24.     #define FLAG_OPEN_SOURCE 9 /* Gpio is open source type */
  25.     
  26.     #define ID_SHIFT 16 /* add new flags before this one */ 
  27.     #define GPIO_FLAGS_MASK ((1 << ID_SHIFT) - 1)
  28.     #define GPIO_TRIGGER_MASK (BIT(FLAG_TRIG_FALL) | BIT(FLAG_TRIG_RISE))
  29.  
  30. #ifdef CONFIG_DEBUG_FS
  31.     const char    *label;
  32. #endif
  33. };
  34. //采用了一个具有ARCH_NR_GPIOS大小的gpio描述符数组。这个描述符数组便代表了系统所有的gpio。
  35. static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];//ARCH_NR_GPIOS=144,即系统现在有144个GPIO口

  36. //static struct davinci_gpio_controller chips[DIV_ROUND_UP(DAVINCI_N_GPIO, 32)];//将144个GPIO分成每32个一组
  37. //一组GPIO控制器结构,例如GPIO0和GPIO1是一组(共32个GPIO口),共用一组寄存器,所以GPIO0和GPIO1荷载一起用chips[0]来控制
  38. ///共有144个GPIO,分为4组(GPIO0~GPIO8),每组有2个banks(即GPIO0和GPIO1为1组),每组最多可以有32个GPIO,每组的控制寄存器空间有10个。
  39. struct davinci_gpio_controller {
  40.     struct gpio_chip    chip;//每组对应的gpio_chip
  41.     int            irq_base;//每组对应的中断
  42.     spinlock_t        lock;//自旋锁
  43.     void __iomem        *regs;//每组的寄存器地址
  44.     void __iomem        *set_data;//设置数据寄存器地址
  45.     void __iomem        *clr_data;//清除数据寄存器地址
  46.     void __iomem        *in_data;//输入数据寄存器地址
  47. }; 

  48. //每一个davinci_gpio_controller结构都对应于一个gpio_chip结构,gpio_chip既可看成是davinci_gpio_controller结构的补充
  49. //表示一个gpio controller.通过这个结构抽象化所有的GPIO源,而让板上其它的模块可以用相同的接口调用使用这些GPIO。
  50. struct gpio_chip {
  51.     const char    *label;
  52.     struct device    *dev;
  53.     struct module    *owner; 
  54.     int    (*request)(struct gpio_chip *chip,unsigned offset);//请求gpio
  55.     void    *free)(struct gpio_chip *chip,unsigned offset);//释放gpio
  56.     int    (*get_direction)(struct gpio_chip *chip,unsigned offset);
  57.     int    (*direction_input)(struct gpio_chip *chip,unsigned offset);//配置gpio为输入,返回当前gpio状态
  58.     int    (*get)(struct gpio_chip *chip,unsigned offset);//获取gpio的状态
  59.     int    (*direction_output)(struct gpio_chip *chip,unsigned offset, int value);//配置gpio为输出,并设置为value
  60.     int    (*set_debounce)(struct gpio_chip *chip,unsigned offset, unsigned debounce);//设置消抖动时间,尤其是gpio按键时有用
  61.     void    (*set)(struct gpio_chip *chip,unsigned offset, int value);//设置gpio为value值
  62.     int    (*to_irq)(struct gpio_chip *chip,unsigned offset);//把gpio号转换为中断号
  63.     void    (*dbg_show)(struct seq_file *s,struct gpio_chip *chip);
  64.     int    base;// 这个gpio控制器的gpio开始编号
  65.     u16    ngpio;//这个gpio控制器说控制的gpio数
  66.     const char    *const *names;
  67.     unsigned    can_sleep:1;
  68.     unsigned    exported:1;
  69.  
  70. #if defined(CONFIG_OF_GPIO)
  71.     struct device_node *of_node;
  72.     int of_gpio_n_cells;
  73.     int (*of_xlate)(struct gpio_chip *gc,const struct of_phandle_args *gpiospec, u32 *flags);
  74. #endif
  75. #ifdef CONFIG_PINCTRL
  76.     struct list_head pin_ranges;
  77. #endif
  78. };

  79. //GPIO寄存器结构
  80. struct davinci_gpio_regs {
  81.     u32 dir; // gpio方向设置寄存器 
  82.     u32 out_data; // gpio设置为输出时,表示输出状态(0或1) 
  83.     u32 set_data; // gpio设置为输出时,用于输出高电平 
  84.     u32 clr_data; // gpio设置为输出时,用于输出低电平 
  85.     u32 in_data; // gpio设置为输入时,用于读取输入值 
  86.     u32 set_rising; // gpio中断上升沿触发设置 
  87.     u32 clr_rising; // gpio中断上升沿触发清除 
  88.     u32 set_falling; // gpio中断下降沿触发设置 
  89.     u32 clr_falling; // gpio中断下降沿触发清除 
  90.     u32 intstat; // gpio中断状态位,由硬件设置,可读取,写1时清除。 
  91. };

  92. struct gpio {
  93.     unsigned gpio;//gpio号
  94.     unsigned long flags;//gpio标志
  95.     const char *label;//gpio名
  96. };

  97. 三、GPIO的初始化
  98. 1.首先设置GPIO的管脚复用寄存器
  99. static __init void da850_evm_init(void)
  100. {
  101.     //.......
  102.     ret = davinci_cfg_reg_list(da850_gpio_test_pins);
  103.     if (ret) 
  104.         pr_warning("da850_evm_init: gpio test ping mux setup failed: %d\n", ret);
  105.     //.......
  106. }

  107. 2.根据板级结构的资源初始化chips数组,此函数在系统初始化时自动调用
  108. static struct davinci_gpio_controller chips[DIV_ROUND_UP(DAVINCI_N_GPIO, 32)];//将144个GPIO分成每32个一组
  109. static int __init davinci_gpio_setup(void)
  110. {
  111.     int i, base;
  112.     unsigned ngpio;
  113.     struct davinci_soc_info *soc_info = &davinci_soc_info;//板级资源结构
  114.     struct davinci_gpio_regs *regs;

  115.     if (soc_info->gpio_type != GPIO_TYPE_DAVINCI)//判断GPIO类型
  116.         return 0;

  117.     ngpio = soc_info->gpio_num;//GPIO数量144
  118.     if (ngpio == 0) {
  119.         pr_err("GPIO setup: how many GPIOs?\n");
  120.         return -EINVAL;
  121.     }

  122.     if (WARN_ON(DAVINCI_N_GPIO < ngpio))//DAVINCI_N_GPIO=144
  123.         ngpio = DAVINCI_N_GPIO;

  124.     gpio_base = ioremap(soc_info->gpio_base, SZ_4K);//将GPIO的寄存器物理基地址(#define DA8XX_GPIO_BASE        0x01e26000)映射到内存中
  125.     if (WARN_ON(!gpio_base))
  126.         return -ENOMEM;
  127.     
  128.     //共有144个GPIO,分为4组(GPIO0~GPIO8),每组有2个banks(即GPIO0和GPIO1为1组),每组最多可以有32个GPIO,每组的控制寄存器空间有10个。
  129.     //chips[0]--chips[4],base值为0,32,64,96,128,ngpio分别为:32,32,32,32,16
  130.     for (i = 0, base = 0; base < ngpio; i++, base += 32) {
  131.         chips[i].chip.label = "DaVinci";
  132.         //设置操作函数
  133.         chips[i].chip.direction_input = davinci_direction_in;
  134.         chips[i].chip.get = davinci_gpio_get;
  135.         chips[i].chip.direction_output = davinci_direction_out;
  136.         chips[i].chip.set = davinci_gpio_set;

  137.         chips[i].chip.base = base;//每一组开始的GPIO号
  138.         //每组控制的GPIO个数,一般为32个
  139.         chips[i].chip.ngpio = ngpio - base;
  140.         if (chips[i].chip.ngpio > 32)
  141.             chips[i].chip.ngpio = 32;

  142.         spin_lock_init(&chips[i].lock);
  143.         //找到这组GPIO的寄存器地址,初始化chips结构
  144.         regs = gpio2regs(base);
  145.         chips[i].regs = regs;//设置每组的寄存器
  146.         chips[i].set_data = ?s->set_data;
  147.         chips[i].clr_data = ?s->clr_data;
  148.         chips[i].in_data = ?s->in_data;
  149.         
  150.         gpiochip_add(&chips[i].chip);//注册gpio_chip
  151.     }
  152.     //chips数组添加到板级资源中
  153.     soc_info->gpio_ctlrs = chips;
  154.     soc_info->gpio_ctlrs_num = DIV_ROUND_UP(ngpio, 32);

  155.     davinci_gpio_irq_setup();//设置GPIO中断
  156.     return 0;
  157. }
  158. pure_initcall(davinci_gpio_setup);//linux初始化时会自动调用

  159. static struct davinci_gpio_regs __iomem __init *gpio2regs(unsigned gpio)
  160. {
  161.     void __iomem *ptr;
  162.     
  163.     //根据GPIO的基地址累加,其中基地址(gpio_base+0)是REVID(Revision ID Register)寄存器
  164.     //(gpio_base+8)是BINTEN (GPIO Interrupt Per-Bank Enable Register)寄存器
  165.     //所以第一组寄存器从基地址+0x10开始
  166.     if (gpio < 32 * 1)
  167.         ptr = gpio_base + 0x10;
  168.     else if (gpio < 32 * 2)
  169.         ptr = gpio_base + 0x38;
  170.     else if (gpio < 32 * 3)
  171.         ptr = gpio_base + 0x60;
  172.     else if (gpio < 32 * 4)
  173.         ptr = gpio_base + 0x88;
  174.     else if (gpio < 32 * 5)
  175.         ptr = gpio_base + 0xb0;
  176.     else
  177.         ptr = NULL;
  178.     return ptr;
  179. }

  180. int gpiochip_add(struct gpio_chip *chip)
  181. {
  182.     unsigned long    flags;
  183.     int        status = 0;
  184.     unsigned    id;
  185.     int        base = chip->base;
  186.     
  187.     //检测gpio的有效性,判断这组GPIO的起始号是否在有效范围内
  188.     if ((!gpio_is_valid(base) || !gpio_is_valid(base + chip->ngpio - 1))&& base >= 0) {
  189.         status = -EINVAL;
  190.         goto fail;
  191.     }

  192.     spin_lock_irqsave(&gpio_lock, flags);
  193.     
  194.     //如果这组GPIO的起始号小于0,则动态的分配gpio的开始索引。
  195.     if (base < 0) {
  196.         base = gpiochip_find_base(chip->ngpio);//这个函数在gpiolib.c中,在gpio_desc[]中分配chip->ngpio个空间(从最后往前分配),返回第一个index
  197.         if (base < 0) {
  198.             status = base;
  199.             goto unlock;
  200.         }
  201.         chip->base = base;
  202.     }

  203.     //确保这些分配的gpio号没有被其他chip占用
  204.     for (id = base; id < base + chip->ngpio; id++) {
  205.         if (gpio_desc[id].chip != NULL) {
  206.             status = -EBUSY;
  207.             break;
  208.         }
  209.     }
  210.     //填充gpio_desc,将该组内的每个GPIO口的gpio_desc结构和该组的控制结构chip联系起来
  211.     if (status == 0) {
  212.         for (id = base; id < base + chip->ngpio; id++) {
  213.             gpio_desc[id].chip = chip;
  214.             gpio_desc[id].flags = !chip->direction_input? (1 << FLAG_IS_OUT): 0;//设置GPIO口标志
  215.         }
  216.     }
  217.     of_gpiochip_add(chip);

  218. unlock:
  219.     spin_unlock_irqrestore(&gpio_lock, flags);

  220.     if (status)
  221.         goto fail;

  222.     status = gpiochip_export(chip);//与sysfs文件系统有关,这里不关心
  223.     if (status)
  224.         goto fail;

  225.     return 0;
  226. fail:
  227.     /* failures here can mean systems won't boot... */
  228.     pr_err("gpiochip_add: gpios %d..%d (%s) failed to register\n",chip->base, chip->base + chip->ngpio - 1,chip->label ? : "generic");
  229.     return status;
  230. }

  231. .gpio的申请
  232. //所谓申请就是检测GPIO描述符desc->flags的FLAG_REQUESTED标志,已申请的话该标志是1,否则是0
  233. //往往多个gpio作为一个数组来进行申请
  234. int gpio_request_array(struct gpio *array, size_t num)
  235. {
  236.     int i, err;

  237.     for (i = 0; i < num; i++, array++) {//遍历数组中的每一个GPIO,gpio是GPIO号,flags是输入输出标志等,label是其取一个名字
  238.         err = gpio_request_one(array->gpio, array->flags, array->label);
  239.         if (err)
  240.             goto err_free;
  241.     }
  242.     return 0;

  243. err_free:
  244.     while (i--)
  245.         gpio_free((--array)->gpio);
  246.     return err;
  247. }

  248. int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
  249. {
  250.     int err;
  251.     
  252.     //gpio则为你要申请的哪一个管脚,label则是为其取一个名字。
  253.     err = gpio_request(gpio, label);
  254.     if (err)
  255.         return err;

  256.     if (flags & GPIOF_DIR_IN)//GPIO标志是输入
  257.         err = gpio_direction_input(gpio);//设置管脚为输入
  258.     else//GPIO标志是输出
  259.         err = gpio_direction_output(gpio,(flags & GPIOF_INIT_HIGH) ? 1 : 0);//根据标志确定输出1还是0

  260.     if (err)
  261.         gpio_free(gpio);

  262.     return err;
  263. }

  264. int gpio_request(unsigned gpio, const char *label)
  265. {
  266.     struct gpio_desc    *desc;
  267.     struct gpio_chip    *chip;
  268.     int            status = -EINVAL;
  269.     unsigned long        flags;
  270.     //屏蔽中断
  271.     spin_lock_irqsave(&gpio_lock, flags);

  272.     if (!gpio_is_valid(gpio))//判断是否有效,也就是参数的取值范围判断
  273.         goto done;
  274.         
  275.     //根据GPIO号找到对应的GPIO描述符结构
  276.     desc = &gpio_desc[gpio];
  277.     chip = desc->chip;//找到该GPIO所在的组控制器
  278.     if (chip == NULL)
  279.         goto done;
  280.         
  281.     //计数加1
  282.     if (!try_module_get(chip->owner))
  283.         goto done;

  284.     //这里测试并设置flags的第FLAG_REQUESTED位,如果没有被申请就返回该位的原值0
  285.     if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {
  286.         desc_set_label(desc, label ? : "?");//设置GPIO描述符结构desc的label字段
  287.         status = 0;
  288.     } else {
  289.         status = -EBUSY;
  290.         module_put(chip->owner);
  291.         goto done;
  292.     }

  293.     if (chip->request) {/* chip->request may sleep */
  294.         spin_unlock_irqrestore(&gpio_lock, flags);
  295.         status = chip->request(chip, gpio - chip->base);
  296.         spin_lock_irqsave(&gpio_lock, flags);

  297.         if (status < 0) {
  298.             desc_set_label(desc, NULL);
  299.             module_put(chip->owner);
  300.             clear_bit(FLAG_REQUESTED, &desc->flags);
  301.         }
  302.     }

  303. done:
  304.     if (status)
  305.         pr_debug("gpio_request: gpio-%d (%s) status %d\n",gpio, label ? : "?", status);
  306.     spin_unlock_irqrestore(&gpio_lock, flags);
  307.     return status;
  308. }

  309. .GPIO的操作
  310. 1.设置GPIO为输出或输入
  311. int gpio_direction_input(unsigned gpio)
  312. {
  313.     unsigned long        flags;
  314.     struct gpio_chip    *chip;
  315.     struct gpio_desc    *desc = &gpio_desc[gpio];
  316.     int            status = -EINVAL;

  317.     spin_lock_irqsave(&gpio_lock, flags);
  318.     
  319.     //判断GPIO号是否有效
  320.     if (!gpio_is_valid(gpio))
  321.         goto fail;
  322.     //找到GPIO对应的gpio_chip结构
  323.     chip = desc->chip;
  324.     if (!chip || !chip->get || !chip->direction_input)
  325.         goto fail;
  326.     
  327.     //确保此GPIO是在此组内,chip->base是此组GPIO的起始号,chip->ngpio是此组GPIO的个数
  328.     gpio -= chip->base;
  329.     if (gpio >= chip->ngpio)
  330.         goto fail;
  331.         
  332.     //确保GPIO已申请
  333.     status = gpio_ensure_requested(desc, gpio);
  334.     if (status < 0)
  335.         goto fail;

  336.     //到这里可以确保GPIO是有效的
  337.     spin_unlock_irqrestore(&gpio_lock, flags);

  338.     might_sleep_if(chip->can_sleep);
  339.     //status=0
  340.     if (status) {
  341.         status = chip->request(chip, gpio);
  342.         if (status < 0) {
  343.             pr_debug("GPIO-%d: chip request fail, %d\n",chip->base + gpio, status);
  344.             goto lose;
  345.         }
  346.     }
  347.     //调用底层的已经设置过的操作,这里即davinci_direction_in
  348.     status = chip->direction_input(chip, gpio);
  349.     if (status == 0)//返回成功
  350.         clear_bit(FLAG_IS_OUT, &desc->flags);//清除输出标志
  351. lose:
  352.     return status;
  353. fail:
  354.     spin_unlock_irqrestore(&gpio_lock, flags);
  355.     if (status)
  356.         pr_debug("%s: gpio-%d status %d\n",__func__, gpio, status);
  357.     return status;
  358. }

  359. int gpio_direction_output(unsigned gpio, int value)
  360. {
  361.     //.........GPIO的检查,同上函数
  362.     
  363.     //调用底层的已经设置过的操作,这里即davinci_direction_out
  364.     status = chip->direction_output(chip, gpio, value);
  365.     if (status == 0)//返回成功
  366.         set_bit(FLAG_IS_OUT, &desc->flags);//设置输出标志
  367. lose:
  368.     return status;
  369. fail:
  370.     spin_unlock_irqrestore(&gpio_lock, flags);
  371.     if (status)
  372.         pr_debug("%s: gpio-%d status %d\n",__func__, gpio, status);
  373.     return status;
  374. }

  375. //根据前边对gpio_chip结构的初始化,会调用\arch\arm\mach-davinci\gpio.c里的函数
  376. static int davinci_direction_in(struct gpio_chip *chip, unsigned offset)
  377. {
  378.     return __davinci_direction(chip, offset, false, 0);
  379. }

  380. static int davinci_direction_out(struct gpio_chip *chip, unsigned offset, int value)
  381. {
  382.     return __davinci_direction(chip, offset, true, value);
  383. }

  384. static inline int __davinci_direction(struct gpio_chip *chip,unsigned offset, bool out, int value)
  385. {
  386.     struct davinci_gpio_controller *d = chip2controller(chip);
  387.     struct davinci_gpio_regs __iomem *g = d->regs;//找到此组GPIO的控制寄存器地址
  388.     unsigned long flags;
  389.     u32 temp;
  390.     u32 mask = 1 << offset;

  391.     spin_lock_irqsave(&d->lock, flags);
  392.     temp = __raw_readl(&g->dir);//读出当前寄存器的输入输出方向
  393.     
  394.     if (out) {//为1设置输出
  395.         temp &= ~mask;
  396.         __raw_writel(mask, value ? &g->set_data : &g->clr_data);//确定是用于输出高电平还是输出低电平
  397.     } 
  398.     else {//为0设置为输入
  399.         temp |= mask;
  400.     }
  401.     __raw_writel(temp, &g->dir);//写入方向寄存器
  402.     spin_unlock_irqrestore(&d->lock, flags);

  403.     return 0;
  404. }

  405. 2.获取gpio的状态
  406. int __gpio_get_value(unsigned gpio)
  407. {
  408.     struct gpio_chip    *chip;

  409.     chip = gpio_to_chip(gpio);
  410.     WARN_ON(chip->can_sleep);
  411.     return chip->get ? chip->get(chip, gpio - chip->base) : 0;//调用davinci_gpio_get
  412. }

  413. static int davinci_gpio_get(struct gpio_chip *chip, unsigned offset)
  414. {
  415.     struct davinci_gpio_controller *d = chip2controller(chip);
  416.     struct davinci_gpio_regs __iomem *g = d->regs;

  417.     return (1 << offset) & __raw_readl(&g->in_data);
  418. }

  419. 3.设置GPIO的值
  420. void __gpio_set_value(unsigned gpio, int value)
  421. {
  422.     struct gpio_chip    *chip;

  423.     chip = gpio_to_chip(gpio);
  424.     WARN_ON(chip->can_sleep);
  425.     chip->set(chip, gpio - chip->base, value);//调用davinci_gpio_set
  426. }

  427. static void davinci_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
  428. {
  429.     struct davinci_gpio_controller *d = chip2controller(chip);
  430.     struct davinci_gpio_regs __iomem *g = d->regs;

  431.     __raw_writel((1 << offset), value ? &g->set_data : &g->clr_data);
  432. }

  433. 六、GPIO驱动编写
  434. 1.首先要申请GPIO口
  435. 2.注册设备
  436. 3.创建GPIO的sysfs相关文件
  437. #define GPIO_MAJOR 199         // major device NO.
  438. #define GPIO_MINOR 0         // minor device NO.
  439. #define DEVICE_NAME "omapl138_gpios" /*定义设备驱动的名字,或设备节点名称*/

  440. #define SET_OUTPUT_LOW 0
  441. #define SET_OUTPUT_HIGH 1
  442. #define GET_VALUE 2
  443. #define SET_INPUT 3

  444. static struct class *gpio_class;
  445. static struct gpio gpio_array[] =
  446. {
  447.     /*{ GPIO_TO_PIN(0, 0), GPIOF_OUT_INIT_LOW,     "RTU_WDI_SIGNAL" },will request fail*/
  448.     { GPIO_TO_PIN(0, 1), GPIOF_OUT_INIT_HIGH, "RTU_PLC_BAK_IO1"}, 
  449.     { GPIO_TO_PIN(0, 2), GPIOF_OUT_INIT_LOW,     "RTU_CHG_EN" }, 
  450.     { GPIO_TO_PIN(0, 3), GPIOF_IN,         "RTU_CHG_PG" }, 
  451.     { GPIO_TO_PIN(0, 5), GPIOF_IN,         "RTU_USB_OC_OUT" }, 
  452.     { GPIO_TO_PIN(0, 6), GPIOF_OUT_INIT_LOW,     "RTU_RUN_IND_LED" },
  453.     { GPIO_TO_PIN(1, 10), GPIOF_IN,         "RTU_TSC_BUSY"},
  454.     { GPIO_TO_PIN(1, 11), GPIOF_IN,        "RTU_PENIRQn" },
  455.     { GPIO_TO_PIN(1, 12), GPIOF_OUT_INIT_LOW, "RTU_uP_Q26x_RESET" }, 
  456.     { GPIO_TO_PIN(1, 13), GPIOF_OUT_INIT_HIGH, "RTU_uP_GPRS_PWR_EN" },
  457.     { GPIO_TO_PIN(1, 14), GPIOF_OUT_INIT_HIGH, "RTU_uP_Q26x_ON/OFF" }, 
  458.     { GPIO_TO_PIN(2, 1), GPIOF_OUT_INIT_LOW, "RTU_PLC_Reset" },
  459.     { GPIO_TO_PIN(2, 2), GPIOF_OUT_INIT_LOW, "RTU_PLC_T_Reg" }, 
  460.     { GPIO_TO_PIN(2, 4), GPIOF_OUT_INIT_LOW, "RTU_PLC_BAK_IO2" },
  461.     { GPIO_TO_PIN(2, 5), GPIOF_OUT_INIT_LOW, "RTU_RS485_RE" }, 
  462.     { GPIO_TO_PIN(2, 15), GPIOF_OUT_INIT_HIGH, "RTU_CHPWR_CS" },
  463.     { GPIO_TO_PIN(3, 9), GPIOF_OUT_INIT_HIGH, "RTU_RS485_DE" }, 
  464.     { GPIO_TO_PIN(6, 1), GPIOF_OUT_INIT_HIGH, "RTU_uP_VPIF_CLKO3" },
  465.     { GPIO_TO_PIN(6, 9), GPIOF_IN,         "RTU_KEY_IN2" },
  466.     { GPIO_TO_PIN(6, 11), GPIOF_IN,        "RTU_ALARM_IN5" },
  467.     { GPIO_TO_PIN(6, 15), GPIOF_OUT_INIT_HIGH,"RTU_uP_RESETOUTn" },
  468. };

  469. static int gpio_open(struct inode *inode,struct file *file)
  470. {
  471.     printk(KERN_WARNING"gpio open success!\n");
  472.     return 0;
  473. }

  474. static int gpio_release(struct inode *inode, struct file *filp)
  475. {
  476.   printk (KERN_ALERT "Device gpio released\n");
  477.   return 0;
  478. }

  479. static int gpio_read(struct file*f,char *dst,size_t size,loff_t*offset)
  480. {
  481.     unsigned char num;
  482.     __copy_to_user(&num,dst,1);
  483. #ifdef DEBUG
  484.      printk("__copy_to_user:%d\n",num);
  485. #endif

  486.     return 0;
  487. }

  488. static int gpio_write(struct file*f,const char *src,size_t size,loff_t *offset)
  489. {
  490.      unsigned char num;
  491.      __copy_from_user(&num,src,1);
  492. #ifdef DEBUG
  493.      printk("__copy_from_user:%d\n",num);
  494. #endif
  495.      return 0;

  496. }

  497. static long gpio_ioctl(struct file *file,unsigned int cmd,unsigned long gpio)
  498. {
  499.     int i;
  500.     unsigned long gpio_num = (gpio/100)*16+gpio%100;
  501.     for (i = 0; i < ARRAY_SIZE(gpio_array); i++) {
  502.         if(gpio_array[i].gpio == gpio_num)
  503.             goto valid_gpio;
  504.     }
  505.     return -1;
  506.         
  507. valid_gpio:
  508.     switch(cmd)//cmd表示应用程序传入的 GPIO 动作
  509.     {
  510.         case SET_OUTPUT_LOW://0
  511.         {
  512.             gpio_direction_output(gpio_num, 0);
  513.             break;
  514.         }
  515.         case SET_OUTPUT_HIGH://1
  516.         {
  517.             gpio_direction_output(gpio_num, 1);
  518.             break;
  519.         }
  520.         case GET_VALUE://2
  521.         {
  522.             return gpio_get_value(gpio_num);    
  523.         } 
  524.         case SET_INPUT://3
  525.         {
  526.             gpio_direction_input(gpio_num);
  527.             break;
  528.         }
  529.         default:
  530.         {
  531.             printk(KERN_EMERG "GPIO command mistake!!!\n");
  532.             break;
  533.         }
  534.     }
  535.     return 0;
  536. }
  537.         
  538. static const struct file_operations gpio_fops =
  539. {
  540.   .owner = THIS_MODULE,
  541.   .open = gpio_open,
  542.   .release = gpio_release,
  543.   .read = gpio_read,
  544.   .write = gpio_write,
  545.   .unlocked_ioctl = gpio_ioctl,
  546. };

  547. static int __init gpio_init(void) /*内核初始化会调用该函数*/
  548. {
  549.     int ret;
  550.     
  551.     ret = gpio_request_array(gpio_array, ARRAY_SIZE(gpio_array));
  552.     if (ret < 0) 
  553.     {
  554.         printk(KERN_EMERG "GPIO request failed\n");
  555.         goto request_failed; 
  556.     }
  557.     
  558.     dev_t my_dev_no;
  559.     struct cdev *gpio_cdev;
  560.     gpio_cdev = cdev_alloc();
  561.     if(gpio_cdev == NULL)
  562.     {
  563.         printk(KERN_EMERG "Cannot alloc cdev\n");
  564.         goto request_failed;
  565.     }
  566.     cdev_init(gpio_cdev,&gpio_fops);
  567.     gpio_cdev->owner=THIS_MODULE;
  568.     int result=alloc_chrdev_region(&my_dev_no,0,1,DEVICE_NAME); 
  569.     if(result < 0)
  570.     {
  571.         printk(KERN_EMERG "alloc_chrdev_region failed\n");
  572.         goto request_failed;
  573.     }
  574.     ret=cdev_add(gpio_cdev,my_dev_no,1); 
  575.     
  576.     
  577.   ret = register_chrdev(GPIO_MAJOR, DEVICE_NAME, &gpio_fops);//驱动字符设备
  578.      if(ret < 0)
  579.      {
  580.     printk(KERN_EMERG "GPIO register failed\n");
  581.     goto request_failed;
  582.      }
  583.     
  584.     //在sysfs文件系统下创建一个类
  585.   gpio_class = class_create(THIS_MODULE, DEVICE_NAME);
  586.   //device_create-->device_create_vargs-->device_register创建相应的sysfs文件(如dev文件),用于udev根据sysfs文件系统下的dev文件创建设备节点
  587.     device_create(gpio_class, NULL, MKDEV(GPIO_MAJOR, GPIO_MINOR), NULL, DEVICE_NAME);
  588.     return ret;
  589.     
  590. request_failed:
  591.     gpio_free_array(gpio_array, ARRAY_SIZE(gpio_array)); 
  592.     return ret;
  593. }

  594. static void __exit gpio_exit(void)
  595. {
  596.     device_destroy(gpio_class, MKDEV(GPIO_MAJOR, GPIO_MINOR));
  597.   class_unregister(gpio_class);
  598.   class_destroy(gpio_class);
  599.   unregister_chrdev(GPIO_MAJOR, DEVICE_NAME);
  600. }

  601. module_init(gpio_init);
  602. module_exit(gpio_exit);
  603. MODULE_LICENSE("GPL");
  604. MODULE_VERSION ("v2.0");
  605. MODULE_AUTHOR("wbl <>");
  606. MODULE_DESCRIPTION("OMAPL138 GPIO driver");
0 0