平台移植 GPIO
2011-12-11 22:52
211 查看
GPIO的驱动主要就是读取GPIO口的状态,或者设置GPIO口的状态。就是这么简单,但是为了能够写好的这个驱动,在LINUX上作了一些软件上的分层。
为了让其它驱动可以方便的操作到GPIO,在LINUX里实现了对GPIO操作的统一接口,这个接口实则上就是GPIO驱动的框架,具体的实现文件为gpiolib.c
在配置内核的时候,我们必须使用CONFIG_GENERIC_GPIO这个宏来支持GPIO驱动。
gpiolib.c是提供了一个通用的库函数,里面定义了static struct gpio_desc gpio_desc[]数组,不同的平台都会调用gpiochip_add()这个库函数去初使化gpio_desc结构体数组,该结构体包含struct
gpio_chip结构体(包括回调函数和gpio个数)。
struct gpio_chip {
… ...
int (*request)(struct gpio_chip *chip, unsigned offset);
void (*free)(struct gpio_chip *chip, unsigned offset);
int (*direction_input)(struct gpio_chip *chip, unsignedoffset);
int (*get)(struct gpio_chip *chip, unsigned offset);
int (*direction_output)(struct gpio_chip *chip, unsignedoffset, int value);
int (*set_debounce)(struct gpio_chip *chip, unsigned offset,
unsigneddebounce);
void (*set)(struct gpio_chip *chip, unsigned offset, int value);
int (*to_irq)(struct gpio_chip *chip, unsigned offset);
void (*dbg_show)(struct seq_file *s, struct gpio_chip *chip);
int base;
u16 ngpio;
… ...
};
这里我们把目光放到gpiolib.c上,主要对外提供的接口函数,在其头文件gpio.h里可以看到:
申请和释放GPIO资源:
extern int gpio_request(unsigned gpio, const char *label);
extern void gpio_free(unsigned gpio);
设置GPIO口方向的操作:
extern int gpio_direction_input(unsigned gpio);
extern int gpio_direction_output(unsigned gpio, int value);
设置GPIO口高低电平值操作:
extern int gpio_get_value_cansleep(unsigned gpio);
extern void gpio_set_value_cansleep(unsigned gpio, int value);
extern int __gpio_get_value(unsigned gpio);
extern void __gpio_set_value(unsigned gpio, int value);
GPIO驱动的关系图:
如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其对应的右下方部分为GPIO硬件操作接口,也就是说对外提供的接口最终会一一对应的对硬件GPIO进行操作。
再来看左边部分,左上方部分为一全局数组,记录各个GPIO的描述符,即对应左下方的gpio_desc结构体,其中gpio_chip指向硬件层的GPIO,flags为一标志位,用来指示当前GPIO是否已经占用,当用gpio_request申请GPIO资源时,flags位就会置位,当调用gpio_free释放GPIO资源时,flags就会清零。label是一个字符串指针,用来作说明。
在软件上,我们首先通过函数gpiochip_add注册一个gpio_chip对应的gpio_desc到全局数组gpio描述符中。其中,一个描述符对应一个GPIO,所以如果我们要使用多个GPIO,那么就在gpio_chip结构体的ngpio指定个数,base为起始的GPIO号。
如果你想使用GPIO驱动,那么在配置内核的时候请把该驱动选上,即定义宏CONFIG_GENERIC_GPIO,然后在你的驱动里加入头文件linux/gpio.h,这样就可以用那些操作函数了。
转自:http://blog.csdn.net/lqx4_3/article/details/6632419
gpio_request代码详解:http://blog.csdn.net/beyondioi/article/details/6984406
fsl imx51 gpio:http://blog.21ic.com/user1/6977/archives/2011/84629.html
Marvell gpio:/article/1669822.html
为了让其它驱动可以方便的操作到GPIO,在LINUX里实现了对GPIO操作的统一接口,这个接口实则上就是GPIO驱动的框架,具体的实现文件为gpiolib.c
在配置内核的时候,我们必须使用CONFIG_GENERIC_GPIO这个宏来支持GPIO驱动。
gpiolib.c是提供了一个通用的库函数,里面定义了static struct gpio_desc gpio_desc[]数组,不同的平台都会调用gpiochip_add()这个库函数去初使化gpio_desc结构体数组,该结构体包含struct
gpio_chip结构体(包括回调函数和gpio个数)。
struct gpio_chip {
… ...
int (*request)(struct gpio_chip *chip, unsigned offset);
void (*free)(struct gpio_chip *chip, unsigned offset);
int (*direction_input)(struct gpio_chip *chip, unsignedoffset);
int (*get)(struct gpio_chip *chip, unsigned offset);
int (*direction_output)(struct gpio_chip *chip, unsignedoffset, int value);
int (*set_debounce)(struct gpio_chip *chip, unsigned offset,
unsigneddebounce);
void (*set)(struct gpio_chip *chip, unsigned offset, int value);
int (*to_irq)(struct gpio_chip *chip, unsigned offset);
void (*dbg_show)(struct seq_file *s, struct gpio_chip *chip);
int base;
u16 ngpio;
… ...
};
这里我们把目光放到gpiolib.c上,主要对外提供的接口函数,在其头文件gpio.h里可以看到:
申请和释放GPIO资源:
extern int gpio_request(unsigned gpio, const char *label);
extern void gpio_free(unsigned gpio);
设置GPIO口方向的操作:
extern int gpio_direction_input(unsigned gpio);
extern int gpio_direction_output(unsigned gpio, int value);
设置GPIO口高低电平值操作:
extern int gpio_get_value_cansleep(unsigned gpio);
extern void gpio_set_value_cansleep(unsigned gpio, int value);
extern int __gpio_get_value(unsigned gpio);
extern void __gpio_set_value(unsigned gpio, int value);
GPIO驱动的关系图:
如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其对应的右下方部分为GPIO硬件操作接口,也就是说对外提供的接口最终会一一对应的对硬件GPIO进行操作。
再来看左边部分,左上方部分为一全局数组,记录各个GPIO的描述符,即对应左下方的gpio_desc结构体,其中gpio_chip指向硬件层的GPIO,flags为一标志位,用来指示当前GPIO是否已经占用,当用gpio_request申请GPIO资源时,flags位就会置位,当调用gpio_free释放GPIO资源时,flags就会清零。label是一个字符串指针,用来作说明。
在软件上,我们首先通过函数gpiochip_add注册一个gpio_chip对应的gpio_desc到全局数组gpio描述符中。其中,一个描述符对应一个GPIO,所以如果我们要使用多个GPIO,那么就在gpio_chip结构体的ngpio指定个数,base为起始的GPIO号。
如果你想使用GPIO驱动,那么在配置内核的时候请把该驱动选上,即定义宏CONFIG_GENERIC_GPIO,然后在你的驱动里加入头文件linux/gpio.h,这样就可以用那些操作函数了。
转自:http://blog.csdn.net/lqx4_3/article/details/6632419
gpio_request代码详解:http://blog.csdn.net/beyondioi/article/details/6984406
fsl imx51 gpio:http://blog.21ic.com/user1/6977/archives/2011/84629.html
Marvell gpio:/article/1669822.html
相关文章推荐
- Intellij idea移植Cordova的Android平台代码至Android Studio的一些问题
- cocos2dx移植android平台
- ACE Proactor 框架移植到Linux平台后无法响应events
- PCA9557 GPIO扩展芯片移植
- freescale i.mx23平台上移植android2.2-froyo - audio 系统.
- Mplayer在ARM平台上的移植总结
- Cocos2dx之使用cygwin移植win32项目到Android平台
- 深入浅出 - Android系统移植与平台开发(八)- HAL Stub框架分析
- 移植mysql到嵌入式ARM平台
- 微软移植到Linux平台的首个Sysinternals工具ProcDump上线
- 如何将SQL/ASESERVER移植到同种平台的系统上
- 怎样将lua移植到arm平台的linux内核
- OpenCV2.4.4 移植到arm平台过程详解,及 __extern_inline 错误的解决方案
- FFmpeg 2.8.4 移植到android平台(二)
- Linux平台基于S3C2440的MPlayer的移植
- NGNc成功完成S60平台移植
- Linux系统移植和开发平台的搭建
- Cocos2d-x 3.1.1 学习日志12--一Cocos2dx3.1.1移植到Android平台的方法(最有用最有效的!!)
- 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三
- [转] 移植Android图形引擎Skia到MIPS平台经验总结(二)