说明:
通过借用面向对象的思想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);
}