本文共 1245 字,大约阅读时间需要 4 分钟。
在kernel里添加一个已知芯片地址的外围设备的驱动,主要包含申请注册使用等
1. 定义主要变量:
static struct i2c_client *key_ic_client;static struct i2c_board_info key_ic_info = { /* 0x11 is the slave ic addr */ I2C_BOARD_INFO("carplay_key_ic", 0x11),};2. 注册申请i2c外围设备:
struct i2c_adapter *i2c_adap; printk(KERN_ALERT "%s\n", __func__); i2c_adap = i2c_get_adapter(5); // i2c_5 if (i2c_adap == NULL) { printk(KERN_ERR "%s No adapter available!\n", __func__); return 0; } key_ic_client = i2c_new_device(i2c_adap, &key_ic_info); if (NULL == key_ic_client) { printk(KERN_ERR "%s i2c_new_device is Err!\n", __func__); return 0; } if (i2c_adap) { printk(KERN_ERR "%s i2c_adap is OK!\n", __func__); i2c_put_adapter(i2c_adap); }3. 使用写函数向寄存器写入数据:
不同的i2c芯片要求的写函数,未必一样,要根据芯片的数据手册,来决定使用什么样的kernel里的写入驱动函数;
int ret = 0; ret = i2c_smbus_write_byte_data(key_ic_client, 0x10, 0x33); if (ret < 0) { printk(KERN_ERR "%s: i2c_smbus_write_byte_data err\n", __func__); }4. 使用读函数读取寄存器里的数据:
不同的i2c芯片要求的读函数,未必一样,要根据芯片的数据手册,来决定使用什么样的kernel里的读取驱动函数;
i2c_smbus_write_byte(key_ic_client, 0x00); udelay(500); // this delay is Necessary value = i2c_smbus_read_byte(key_ic_client); printk(KERN_ALERT "%s: value = 0x%x\n", __func__, value);这个例子中,读取函数之间有延时,是因为,这个芯片来不及处理读取请求,需要延时一段时间,再读取。大部分芯片不需要这种延时。
转载地址:http://usngi.baihongyu.com/