在kernel里添加一个i2c外围设备

在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);

      这个例子中,读取函数之间有延时,是因为,这个芯片来不及处理读取请求,需要延时一段时间,再读取。大部分芯片不需要这种延时。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值