OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3679|回复: 0

Linux多点电容触摸,无法正确获取reset引脚

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-5-21
在线时间
2 小时
发表于 2022-6-19 11:46:44 | 显示全部楼层 |阅读模式
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 = &regAddr;      //将寄存器首地址放入到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");



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 10:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表