probe:
device_create_file(&i2c->dev, &dev_attr_reg); 创建节点;
定义节点:
static DEVICE_ATTR(reg, 0664, reg_show, reg_store);
创建寄存器数组,方便读取:
reg[] = {………………};
寄存器读取函数
static ssize_t reg_show(struct device *dev, struct device_attribute *attr,
char *buf){
int i, n;
for(i = 0; i < 80; i++){
n = snd_soc_component_read32(component_debug, reg[i]);
printk(" reg 0x%x = %x\n", rt5651_reg[i].reg, n);
}
return 0;
}
数据转换函数:
int change(char c){
if(c == '0')
return 0;
else if(c == '1')
return 1;
else if(c == '2')
return 2;
else if(c == '3')
return 3;
else if(c == '4')
return 4;
else if(c == '5')
return 5;
else if(c == '6')
return 6;
else if(c == '7')
return 7;
else if(c == '8')
return 8;
else if(c == '9')
return 9;
else if(c == 'a')
return 10;
else if(c == 'b')
return 11;
else if(c == 'c')
return 12;
else if(c == 'd')
return 13;
else if(c == 'e')
return 14;
else if(c == 'f')
return 15;
else
return 0;
}
寄存器操作:(echo regval > reg, 例如写0x0001 到0x01 就echo 010001 > reg)
static ssize_t reg_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t size)
{
int reg, val;
struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component_debug);
printk("DICKE printk %s \n", &buf);
reg = change(buf[0])*16 + change(buf[1]);
val = (change(buf[2]))*16*16*16 + (change(buf[3]))*16*16 + (change(buf[4])) * 16 +(change(buf[5]));
printk("DICKE printk reg = 0x%x, val = %x\n", reg, val);
if((reg == 0x01)&&(val == 0xffff)){
rt5651_enable_micbias1_for_ovcd(component_debug);
}else if((reg == 0x01)&&(val == 0x0000)){
rt5651_disable_micbias1_for_ovcd(component_debug);
}else
regmap_write(rt5651->regmap, reg, val);
return size;
}
两个函数返回值,最好为size。