1、在probe函数中添加创建函数。
int ret = 0;
.......
ret = driver_create_file(&client->driver->driver, &driver_attr_mode);
if(ret)
goto err1;
err1:
driver_remove_file(&client->driver->driver, &driver_attr_mode);
2、实现sys文件的主文件操作函数包括读和写文件的操作。
static int s_value=0;
static ssize_t show_mode(struct device_driver *dev, char *buf)
{
u32 reg;
reg = s_value;
return snprintf(buf, PAGE_SIZE, "%u \n", reg);
}
static ssize_t store_mode(struct device_driver *dev, const char *buf, size_t count)
{
char *endp;
int err = 0;
int mode = simple_strtoul(buf, &endp, base); //buf指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。(base为要用的基数(进制数),base为0表示通过cp来自动判断基数,函数自动可识别的基数:‘0x’表示16进制,‘0’表示8进制,其它都认定为10进制。通常设为0)
size_t num = endp - buf;
if (*endp && isspace(*endp)) //检查参数c是否为空格字符,也就是判断是否为空格(' ')、水平定位字符
//('\t')、归位键('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况。
//返回值,若参数c为空格字符,则返回TRUE,否则返回NULL(0)。
num++;
if (num != count)
return -EINVAL;
switch(mode) //mode对应是echo传进来的参数
{
case option1:
{
s_value=0;
//对用户层输入的信息进行操作。
break;
}
case option2:
{
s_value=1;
//对用户层输入的信息进行操作。
break;
}
default:
err = -EOPNOTSUPP;
printk("without the option \n");
break;
}
return count;
}
3、属性文件的创建说明
DRIVER_ATTR(mode, 0644, show_mode, store_mode);
4、用户层的使用说明
echo ‘0’ > /sys/bus/i2c/driver/xxx/mode (0对应option1)