从用户空间传递i2c要写的数据

本文介绍如何通过创建I2C读写节点,实现从用户空间传递I2C通信的数据,以满足将特定字节序列(如0x00 0x12 0x34 0xab 0x00)发送给GPS芯片的需求。示例代码展示了写操作的实现过程。

客户有个需求,要从用户空间传递i2c要写的数据,比如发送数据:0x00 0x12 0x34 0xab 0x00给gps芯片。

可以创建一个i2c的读写节点:

static DEVICE_ATTR(gpsdata, S_IWUSR | S_IRUGO, i2c_gps_data_show, i2c_data_store);

约定应用层发送的数据格式如下:00,12,34,ab,… 00

其写操作参考代码如下:

static ssize_t i2c_gps_data_store(struct device *dev, struct device_attribute *attr,
				const char *buf, size_t count)
{
	char udata[256] = {0};
	char *src = NULL;
	char *token[20] = {NULL};
	
	int i = 0, len = 0;
	int ret = 0;
	
	int n;
	unsigned long temp;
	
	char gps_write_data[20]={0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
						  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
	
	//if (buf[0] == '\0')
	//  return -EINVAL;
	
	memcpy(udata, buf, strlen(buf)); 
	
	src = strstrip(udata); //去掉字符串s中的前后空白符(制表符、空格、回车等)
	len = strlen(src);   //得到有效长度
	n= (len+1)/3;	  //得到数据长度,最后没有“,”  所以+1
	pr_err("%s:src = %s, len = %d, n=%d\n", __func__, src, len, n);
	
	for (i = 0; i < n; i++) 
	{
	  token[i] = strsep(&src, ",");  //破坏性分割字符串,返回分割前一部分,后一部分保存在原字符中
	  pr_err("%s:token[%d] = %s\n", __func__, i, token[i]);

	  //if (src) {
    	//pr_err("%s:too many arguments. invalid = %s\n", __func__, src);
    	//return -EINVAL;
  	  //}
	
	  ret = kstrtoul(token[i], 16, &temp); //变换一个字符串为无符号的long 型
	  gps_write_data[i] = (char)temp;
	  //if (ret || (0 == gps_write_data[i])) {
	  if (ret) {
		  pr_err("%s:Analysis error in:%s\n", __func__, token[i]);
		  return -EINVAL;
	  }
	
	  printk(KERN_ERR "gps_write_data[%d]:0x%x\n",i, gps_write_data[i]);
	}

	gps_i2c_write_nbytes(gps1, gps_write_data, n);
	
	return count;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归心2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值