说明:
通过借用面向对象的思想linux中的驱动程序呈现两个特点,分层与分离.就是将重复的代码抽象出来,用户仅需关心不一样的部分.通过抽象,将一些设备的共同部分抽取出来,内核实现 通用部分,用户实现具体不一样部分.输入驱动,rtc驱动,i2c驱动等都是这样实现的.gpio输入驱动: 说明:
gpio驱动是指用gpio来实现的按键输入驱动.内核drivers/input/keyboard/gpio_keys.c中实现通用的按键驱动.从这个例子可以看出,通过抽象,将数据与程序分离.用户只需关心按键的定义即可.
变量:
struct gpio_keys_button{//用于描述gpio按键的资源 code gpio type desc active_low wakeup … } struct gpio_keys_platform_data{ buttons //上面描述的资源 nbuttons//数量 }
函数:
input_dev* input_allocate_device(void) input_free_device(input_dev*)
input_register_device(input_dev*) input_unregister_device(input_dev*) input_event(input_dev*,unsigned int code,unsigned int type,int value) input_report_key(input_dev*,unsigned int code,unsigned int type,int value) input_report_rel(input_dev*,unsigned int code,unsigned int type,int value) input_report_abs(input_dev*,unsigned int code,unsigned int type,int value) input_sync(input_dev*)用法:
定义gpio_keys_button结构成员 xx_buttons[]={ { .gpio= .code= .wakeup= .desc= .active_low= }, { .gpio= .code= .wakeup= .desc= .active_low= }, … } //定义platform_data xx_key_platform_data={ .buttons=&xx_buttons; .nbuttons=ARRAY_SIZE(xx_buttons) } //将platform_data赋予dev xx_device={ .name=”xx”,//名字要为gpio-keys或者gpio-keys-polled .id=1; .dev={ .platform_data=&xx_key_platforn_data; } } //在合适的地方调用platform_device,系统自动回匹配相应的驱动 xx_fun() { platform_device_register(&xx_device); }