(开发记录)tca9539芯片驱动(一)

SONG 2020-08-18 15:23:17 4014

硬件问题:

  将安卓设备的芯片直接替换成海思hi3516dv300,降低生产成本,直接改完后发现io口不够,所以新添加一个tca9539的gpio扩展芯片作gpio扩展。

TCA9539芯片

  芯片通过i2c控制通信,将一个i2c控制器扩展为16个gpio口,控制方法也比较简单,一共8个寄存器,寄存器0、1用来读取管脚状态,寄存器2,3控制输出管脚的高低,4,5是什么极性翻转,具体也不知道什么意思,驱动中并没有用到;最后6,7两组寄存器控制io口的方向,贴张图说明一下,文章末尾有手册的下载地址。
tca9539寄存器
  因为我们不同设备用的同一套应用代码,tca9539芯片只用在了一种设备上,所以在编写驱动程序的时候应该尽量不对应用代码做太大的改动,防止代码繁冗的像依托shift。
  所以我将驱动程序写成了类似gpio文件操作一样的形式,通过export导出io口,然后通过操作目录下的direction和value文件对相应的io口进行操作,因为我们系统层控制gpio口也是通过操作文件的方式,所以使用这种方法后应用层代码只需要做一次判断将文件路径替换就可以操作tca9539的io口了。
  内核版本使用的是4.9.37,在内核目录下的drivers/gpio/gpiolib-sysfs.c中介绍了内核是如何用过文件去操作gpio口的。
  抛开代码中各种各样的结构体,可以看到在用户每次调用export函数的时候,
内核通过device_create_with_groups函数创建一个新的设备文件节点,而我所需要的就是这个。
初始化过程

     ASSERT(!tca_i2c_init(), return FAILURE);

     ret = alloc_chrdev_region(&devno,minor,count, "xxx");
     if(ret) {
         printk("Failed to alloc_chrdev_region.\n");
         return ret;
     }

     ptca = cdev_alloc();
     if(ptca == NULL) {
         printk("Failed to cdev_alloc.\n");
         goto err1;
     }
     cdev_init(ptca, &fops);

     ret = cdev_add(ptca, devno, count);
     if(ret < 0) {
         printk("Failed to cdev_add.");
         goto err2;
     }

     ret = class_register(&tca_class);                                  
     if (ret < 0) {                                                     
         return ret;                                                    
     }                                                                  

export函数:

static ssize_t export_store(struct class *class,                                                                                      
            struct class_attribute *attr,                                                                                             
            const char *buf, size_t len)                                                                                              
{                                                                                                                                     
    struct device *dev;                                                                                                               
    long            gpio;                                                                                                             
    int ret ;                                                                                                                         

    ret  = kstrtol(buf, 0, &gpio);                                                                                                    
    if (ret < 0)                                                                                                                      
        return -1;                                                                                                                    
    printk("gpio = %ld \n", gpio);                                                                                                    

    printk("export_store\n");                                                                                                         
    dev = device_create_with_groups(&tca_class, NULL, MKDEV(MAJOR(devno), 
        MINOR(devno)+gpio), NULL, gpio_groups, "tgpio%ld", gpio);   

    return len;                                                                                                                       
}                                                                                                                                     

还有就是direction和value的操作函数了,这两个函数基本同内核中的函数一致就可以了。然后就可以通过操作文件来操作芯片扩展的io口了。
操作方式

tca9539数据手册地址:
链接:https://pan.baidu.com/s/18v1OiTwFjewRWUF8TazIzw
提取码:rifo

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
SONG
红包 1 1 评论 打赏
评论
2个
内容存在敏感词
手气红包
  • SONG 2020-08-22 12:32:08
    回复

    这个是用在人脸识别面板机上的

  • david 2020-08-21 11:50:23
    回复

    16DV300 很多做人脸识别摄像头

相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
SONG
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区