新手入门
- 积分
- 12
- 金钱
- 12
- 注册时间
- 2022-5-21
- 在线时间
- 2 小时
|
1金钱
提个问题:在多点电容触摸章节中,获取设备树下的GPIO,只有中断引脚是正确的,且中断服务函数能够执行,但是reset引脚不能正确获取,值为137,这种情况是怎么回事呢?
代码如下:
#define DEVCNT 1#define DEVNAME "ft5426" static struct FT5426_t { void *privateData; struct device_node *node; struct i2c_client *client; //通过FT5426_probe函数获取 int irq_GPIO,reset_GPIO,irq_num;}ft5426;//读取多个寄存器的值/* regAddr:起始寄存器地址 val:用val来获取数据 */static int FT5426_Read_regs(struct FT5426_t *dev,u8 regAddr,void *val,int len){ struct i2c_client *i2c = (struct i2c_client*)dev->privateData; //void指针在使用时要强制转换 struct i2c_msg msg[2]; //1.msg[0]:发送要读取的寄存器首地址 msg[0].addr = i2c->addr; //从机地址 msg[0].flags = 0; //表示发送 msg[0].buf = ®Addr; //将寄存器首地址放入到buf中,表示要发送的是寄存器的首地址 msg[0].len = 1; //一个字节 //2.msg[1]:读取数据 msg[1].addr = i2c->addr; //从机地址 msg[1].flags = I2C_M_RD; //表示读取 msg[1].buf = val; //用val来获取数据 msg[1].len = len; //要读取的长度 return i2c_transfer(i2c->adapter,msg,2);}static int FT5426_Write_regs(struct FT5426_t *dev,u8 regAddr,u8 *data,int len){ u8 buf[256]; //要发送的内容 struct i2c_client *i2c = (struct i2c_client*)dev->privateData; //void指针在使用时要强制转换 struct i2c_msg msg; //由于进行write操作时,要将寄存器地址和数据都放在一起进行发送:寄存器地址 + 数据 buf[0] = regAddr; memcpy(&buf[1], data, len); //从buf[1]开始拷贝,将要发送的数据data拷贝到buf中去 //1.msg[0]:发送要读取的寄存器首地址 msg.addr = i2c->addr; //从机地址 msg.flags = 0; //表示发送 msg.buf = buf; //寄存器地址 + 数据 msg.len = 1 + len; //发送的内容长度:寄存器首地址占一个字节 + 数据内容字节 return i2c_transfer(i2c->adapter, &msg,1);}//只读取一个寄存器值//在那里(寄存器地址),读取什么东西(返回值)static u8 FT5426_Read_reg(struct FT5426_t *dev,u8 regAddr){ u8 data = 0; FT5426_Read_regs(dev,regAddr,&data,1); return data;}//向一个寄存器写入数据//向谁(寄存器地址),写东西(数据)static void FT5426_Write_reg(struct FT5426_t *dev,u8 regAddr,u8 data){ FT5426_Write_regs(dev,regAddr,&data,1);}static irq_handler_t ft5426_handler(int irq, void *dev_id) //中断上报{ //printk("irq:%d \n",irq); // irq = 38 //printk("ft5426_handler \n"); return IRQ_HANDLED;}static void FT5426_Reset_init(struct i2c_client *i2c,struct FT5426_t *dev){ int ret = 0; if (gpio_is_valid(dev->reset_GPIO)) { /* 检查IO是否有效 */ /* 申请复位IO,并且默认输出低电平 */ //devm_gpio_request_one有系统自动释放的作用ret = devm_gpio_request_one(&i2c->dev,dev->reset_GPIO, GPIOF_OUT_INIT_LOW,"FT5426 reset"); if (ret) { printk("gpio is valid\n"); return ret; } msleep(5); gpio_set_value(dev->reset_GPIO, 1); /* 输出高电平,停止复位 */ msleep(300); } return 0;}static int FT5426_Irq_init(struct i2c_client *i2c,struct FT5426_t *dev){ int ret = 0; /* 1,申请中断GPIO */ if (gpio_is_valid(dev->irq_GPIO)) { ret = devm_gpio_request_one(&i2c->dev, dev->irq_GPIO, GPIOF_IN, "edt-ft5x06 irq"); if (ret) { dev_err(&i2c->dev, "Failed to request GPIO %d, error %d\n", dev->irq_GPIO, ret); return ret; } } /* 2,申请中断,client->irq就是IO中断, */ ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, ft5426_handler, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, i2c->name, &ft5426); if (ret) { dev_err(&i2c->dev, "Unable to request touchscreen IRQ.\n"); return ret; } return 0;}static int FT5426_probe(struct i2c_client *i2c, const struct i2c_device_id *id){ ft5426.client = i2c; //如果匹配成功,系统则会分配一个struct i2c_client *i2c作为形式参数传递进来 ft5426.node = of_find_node_by_path("/ft5426"); //获取irq和reset引脚 ft5426.irq_GPIO = of_get_named_gpio(i2c->dev.of_node,"interrupt-gpios",0); //reset引脚获取存在问题 ft5426.reset_GPIO = of_get_named_gpio(i2c->dev.of_node,"Reset-gpios",0); printk("irq_GPIO: %d\n",ft5426.irq_GPIO); printk("reset_GPIO: %d\n",ft5426.reset_GPIO); FT5426_Reset_init(i2c,&ft5426); FT5426_Irq_init(i2c,&ft5426); printk("FT5426_probe\n"); return 0;}static int FT5426_remove(struct i2c_client *i2c){ printk("FT5426_remove\n"); return 0;}static struct i2c_device_id ft5426table[] = { //传统匹配表 // {"LSC,AP3216C",0}, {},};static struct of_device_id ft5426dev[]={ //设备树匹配表 {.compatible = "edt,edt-ft5426"}, {}};static struct i2c_driver ft5426_driver={ .probe = FT5426_probe, .remove = FT5426_remove, .driver = { .owner = THIS_MODULE, .name = "ft5426", .of_match_table = (ft5426dev), }, .id_table = ft5426table,};static int __init FT5426_init(void){ if(i2c_register_driver(THIS_MODULE,&ft5426_driver)) { } return 0;}static void __exit FT5426_exit(void){ i2c_del_driver(&ft5426_driver);}module_init(FT5426_init);module_exit(FT5426_exit);MODULE_LICENSE("GPL");
|
|