关注自由和开源软件
)&bfin_ad7879_ts_info,
},
#endif
#ifdefined(CONFIG_KEYBOARD_ADP5588)||defined(CONFIG_KEYBOARD_ADP5588_MODULE)
{
I2C_BOARD_INFO("adp5588-keys",0x34),
.irq=IRQ_PG0,
.platform_data=(void*)&adp5588_kpad_data,
},
#endif
#ifdefined(CONFIG_PMIC_ADP5520)||defined(CONFIG_PMIC_ADP5520_MODULE)
{
I2C_BOARD_INFO("pmic-adp5520",0x32),
.irq=IRQ_PG0,
.platform_data=(void*)&adp5520_pdev_data,
},
#endif
#ifefined(CONFIG_INPUT_ADXL34X_I2C)|| defined(CONFIG_INPUT_ADXL34X_I2C_MODULE)
{
I2C_BOARD_INFO("adxl34x", 0x53),
.irq = IRQ_PG0,
.platform_data = (void *)&adxl34x_info,
},
#endif
};
static void __init blackfin_init(void)
{
(...)
i2c_register_board_info(0,bfin_i2c_board_info, ARRAY_SIZE(bfin_i2c_board_info));
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
(...)
}
因此,为了启用这样一个驱动程序,只需要编辑板支持文件,将适当的条目添加至i2c_board_info(spi_board_info)。
还应注意到,需在内核配置期间选择驱动程序。驱动程序按照所属的子系统分类。可在以下位置查找ADXL34x驱动程序:
Device Drivers--->
Input device support --->
[*] Miscellaneous devices --->
<M>Analog Devices AD714x Capacitance Touch Sensor
<M>support I2C bus connection
<M>support SPI bus connection
<*>Analog Devices ADXL34x Three-Axis
Digital Accelerometer
<*>support I2C bus connection
<*>support SPI bus connection
一旦用户开始内核构建过程,就会自动编译所选的驱动程序。上面的代码声明I2C总线0上有四个设备,包括其各自的地址、IRQ以及其驱动程序所需的定制platform_data。注册相关I2C总线时,i2c-core内核子系统会自动实例化这些I2C设备。
static struct i2c_driver adxl34x_driver = {
.driver={
.name="adxl34x",
.owner=THIS_MODULE,
},
.probe=adxl34x_i2c_probe,
.remove=__devexit_p(adxl34x_i2c_remove),
.suspend=adxl34x_suspend,
.resume=adxl34x_resume,
.id_table=adxl34x_id,
};
static int __init adxl34x_i2c_init(void)
{
return i2c_add_driver(&adxl34x_driver);
}
module_init(adxl34x_i2c_init);
在内核启动的某一时间点,或者在其后的任何时候,一个名为adxl34x的设备驱动程序可以利用struct i2c_driver注册自己--通过调用i2c_add_driver()进行注册。struct i2c_driver的成员利用指向ADXL34x驱动程序函数的指针进行设置,将驱动程序与其总线主控内核相连接。(宏module_init()定义模块插入时调用哪个函数(adxl34x_ i2c_init())。)
如果存档的驱动程序名称与宏I2C_BOARD_INFO所提供的名称相符,i2c-core总线模型实现方法将调用驱动程序的probe()函数,将相关的platform_data和irq从板支持文件传递到驱动程序。这仅会在没有追索冲突的情况下发生,例如前一实例化设备使用同一I2C从地址时。
adxl34x_i2c_probe()函数随后开始执行其名称所表示的功能。它通过读取制造商和设备ID,检查ADXL345或ADXL346是否存在以及是否正常工作。如果检查成功,驱动程序的探测函数将分配特定设备数据结构,请求中断,并初始化加速度计。
然后利用input_allocate_device()分配新的输入设备结构,并设置输入位域。这样,设备驱动程序就告知输入系统的其他部分这是何种设备,以及这种新的输入设备能够产生何种事件。最后,ADXL34x驱动程序通过调用input_register_device()注册该输入设备。
这将把新的输入设备结构添加到输入驱动程序的链接列表中,并调用设备处理程序模块的连接函数,告知其已出现一个新的输入设备。从此时起,该设备可以产生中断。一旦执行中断服务例程,就会从加速度计读取状态寄存器和事件FIFO,并利用nput_event()向输入子系统发回适当的事件。
- 基于开源软件的嵌入式网络打印服务器(11-05)
- GCC-维基百科(04-13)
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于Winodws CE的嵌入式网络监控系统的设计与实现(03-05)
- 嵌入式系统实时性的问题(06-21)
- 嵌入式实时系统中的优先级反转问题(06-10)