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

1521

被折叠的 条评论
为什么被折叠?



