(开发记录)tca9539芯片驱动(一)
硬件问题:
将安卓设备的芯片直接替换成海思hi3516dv300,降低生产成本,直接改完后发现io口不够,所以新添加一个tca9539的gpio扩展芯片作gpio扩展。
TCA9539芯片
芯片通过i2c控制通信,将一个i2c控制器扩展为16个gpio口,控制方法也比较简单,一共8个寄存器,寄存器0、1用来读取管脚状态,寄存器2,3控制输出管脚的高低,4,5是什么极性翻转,具体也不知道什么意思,驱动中并没有用到;最后6,7两组寄存器控制io口的方向,贴张图说明一下,文章末尾有手册的下载地址。

因为我们不同设备用的同一套应用代码,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
- 分享
- 举报
-
浏览量:2289次2023-05-16 15:43:05
-
浏览量:1502次2023-06-21 10:50:13
-
浏览量:8108次2020-08-27 10:20:57
-
浏览量:5760次2021-08-09 15:36:00
-
浏览量:12785次2022-11-10 18:07:40
-
浏览量:11677次2020-12-16 18:56:54
-
浏览量:9609次2021-01-15 16:31:31
-
浏览量:1297次2023-05-06 13:40:15
-
浏览量:3191次2020-11-26 09:51:23
-
浏览量:1424次2023-06-12 14:35:37
-
浏览量:2207次2020-08-10 19:19:56
-
浏览量:6409次2020-09-18 11:28:51
-
浏览量:1796次2023-01-05 13:59:16
-
浏览量:12415次2020-08-03 14:27:03
-
浏览量:6358次2021-08-05 17:00:59
-
浏览量:1257次2023-07-05 10:11:29
-
浏览量:2818次2020-08-18 20:05:11
-
浏览量:1541次2024-02-21 17:08:25
-
浏览量:6985次2021-12-10 15:40:21
-
7篇
- 海思AI芯片HI3516DV300上SSD代码的移植和优化
- 新基建,新物联!海思Boudica 200 SoC芯片助力NB-IoT“亿”征程
- 从零开始写一个基于Hi3516EV200平台的spi设备驱动框架demo
- 打破行业“内卷化”,是德科技砥砺前行,新品迭出!
- 海思Hi3536交叉编译ffmpeg 和OPencv
- 海思 Hi3516DV30评估版性能介绍
- 一文带你了解编码器与译码器原理
- FPGA的设计艺术(23)parameter的使用建议与defparam的消亡史
- FPGA的设计艺术(13)使用generate语句构建可重用的逻辑设计
- 官宣!英特尔同意90亿美元卖掉NAND存储部门 包括大连工厂
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
SONG
微信支付举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明

微信扫码分享
QQ好友
16DV300 很多做人脸识别摄像头
这个是用在人脸识别面板机上的