zl程序教程

您现在的位置是:首页 >  系统

当前栏目

从Tiny4412--mma7660 gsensor驱动探索Linux内核I2C总线驱动框架

Linux驱动内核框架 -- 探索 总线 I2C
2023-09-27 14:28:47 时间
源码位于: driver/hwmon/mma7660.c
参考博客:http://www.cnblogs.com/pengdonglin137/p/5240416.html

参考mma7660的芯片数据手册:https://wenku.baidu.com/view/3ef59c28ed630b1c59eeb521.html




那么驱动分析完了,设备板级配置文件配置在哪里呢?
代码位置:/arch/arm/mach-exynos/mach-tiny4412.c
在大约2856行的地方,可以看到:
这里通过CONFIG_SENSORS_MMA7660来识别是否有在内核中配置这个sensor,这个配置在源码根目录下的tiny4412_android_defconfig中:
可以搜索到:CONFIG_SENSORS_MMA7660=y

//判断是否有配置CONFIG_SENSORS_MMA7660

#ifdef CONFIG_SENSORS_MMA7660

//如果配置了,就包含7660驱动相关的头文件,并配置板级信息

#include linux/mma7660.h 

static struct mma7660_platform_data mma7660_pdata = {

 .irq = IRQ_EINT(25), //设置外部中断号

 .poll_interval = 100, 

 .input_fuzz = 4,

 .input_flat = 4,

#endif

static struct s3c2410_platform_i2c tiny4412_i2c3_data __initdata = {

 .flags = 0,

 .bus_num = 3,

 .slave_addr = 0x10,

 .frequency = 200*1000,

 .sda_delay = 100,

static struct i2c_board_info i2c_devs3[] __initdata = {

#ifdef CONFIG_SENSORS_MMA7660

 //这就是所谓的i2c_client的信息,在驱动中可以获取

 I2C_BOARD_INFO("mma7660", 0x4c), //I2C板级注册信息

 .platform_data = mma7660_pdata, //将信息存储在platform_data中:

#endif

};
以下为I2C_BOARD_INFO的原型:

/**

 * I2C_BOARD_INFO - macro used to list an i2c device and its address

 * @dev_type: identifies the device type

 * @dev_addr: the devices address on the bus.

 * This macro initializes essential fields of a struct i2c_board_info,

 * declaring what has been provided on a particular board. Optional

 * fields (such as associated irq, or device-specific platform_data)

 * are provided using conventional syntax.

#define I2C_BOARD_INFO(dev_type, dev_addr) \

 .type = dev_type, .addr = (dev_addr)


static void __init smdk4x12_machine_init(void) 大约4147行可以看到,在初始化硬件信息的时候向i2c注册了板级信息: s3c_i2c3_set_platdata( tiny4412_i2c3_data); i2c_register_board_info(3, i2c_devs3, ARRAY_SIZE(i2c_devs3));
morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。