您的位置:首页 > 运维架构 > Linux

分层设计的驱动程序 及gpio驱动(Linux驱动5)

2017-03-12 15:23 302 查看
说明:

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息