最近在学习linux的设备驱动编写,没有什么指导。。偶尔有些小感受小心得体会。。发出来希望能够给和我一样的初学者一点启发和帮助。。有不对的地方希望大家能够指正。。谢谢!
mach/gpio-nrs.h文件部分内容
/* GPIO bank sizes */
#define S3C2410_GPIO_A_NR (32)
#define S3C2410_GPIO_B_NR (32)
#define S3C2410_GPIO_C_NR (32)
#define S3C2410_GPIO_D_NR (32)
#define S3C2410_GPIO_E_NR (32)
#define S3C2410_GPIO_F_NR (32)
#define S3C2410_GPIO_G_NR (32)
#define S3C2410_GPIO_H_NR (32)
#define S3C2410_GPIO_NEXT(__gpio) \
((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 0)
#ifndef __ASSEMBLY__
enum s3c_gpio_number {
S3C2410_GPIO_A_START = 0,
S3C2410_GPIO_B_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_A),
S3C2410_GPIO_C_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_B),
S3C2410_GPIO_D_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_C),
S3C2410_GPIO_E_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_D),
S3C2410_GPIO_F_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_E),
S3C2410_GPIO_G_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_F),
S3C2410_GPIO_H_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_G),
};
#endif /* __ASSEMBLY__ */
/* S3C2410 GPIO number definitions. */
#define S3C2410_GPA(_nr) (S3C2410_GPIO_A_START + (_nr))
#define S3C2410_GPB(_nr) (S3C2410_GPIO_B_START + (_nr))
#define S3C2410_GPC(_nr) (S3C2410_GPIO_C_START + (_nr))
#define S3C2410_GPD(_nr) (S3C2410_GPIO_D_START + (_nr))
#define S3C2410_GPE(_nr) (S3C2410_GPIO_E_START + (_nr))
#define S3C2410_GPF(_nr) (S3C2410_GPIO_F_START + (_nr))
#define S3C2410_GPG(_nr) (S3C2410_GPIO_G_START + (_nr))
#define S3C2410_GPH(_nr) (S3C2410_GPIO_H_START + (_nr))
/*
*这几个宏定义其实很有趣。。理解起来并不难。。开始我理解的时候倒是花了点时间。。
*主要是忘了预处理需要做的事情就是替换#之后的内容。。所以大家再结合下面对
*实际中我们应用格式是直接使用S3C2410_GPB(1),展开就相当于
*S3C2410_GPG(1)->
*S3C2410_GPIO_G_START + (1) ->
*S3C2410_GPIO_NEXT(S3C2410_GPIO_F)->
*(S3C2410_GPIO_F_START +S3C2410_GPIO_NR + CONFIG_S3C_GPIO_SPACE + 0->
*而S3C2410_GPIO_F_START又还可以进行替换。。所以实际替换之后得到
*0+32*5+1+0 = 161 就是从GPA的首地址+GPA个数+GPB的offset就是当前GPB的IO偏移量
*/
阅读(1282) | 评论(1) | 转发(0) |