(6)在 __exit 代码中注销本字符设备驱动
static void __exit tvp5158_i2c_exit(void) { dev_t devno = MKDEV(g_tvp5158_dev.major, 0); i2c_del_driver(&tvp5158_i2c_driver); cdev_del(&g_tvp5158_dev.cdev); unregister_chrdev_region(devno, 1); }注意,本初始化代码和逆初始化在第一篇文章中已经出现过,这里补充完整了,将字符设备驱动的代码添加进来了。
2. 用户空间的使用方法
首先,编写Makefile将驱动编译成模块,然后在用户空间对生成的模块(*.ko)进行加载(insmod),然后再 /dev 目录下创建设备节点 /dev/tvp5158_dev ,最后,在用户空间即可编写测试代码,打开该设备文件,通过 ioctl 命令进行访问。
前面几个步骤很容易,不再赘述,只给出最后在用户空间的测试代码示例。
#include <stdio.h> int main() { int status; struct I2C_Param param; unit8_t reg = 0x08; unit8_t value = 0; int fd = open("/dev/tvp5158_dev", O_RDWR); if( fd < 0) { return -1; } param.reg = ® param.value = &value; status = ioctl(fd,I2C_CMD_READ,¶m); if( status < 0) { printf("read fail!\n"); return -1; } printf("the 0x80 reg 's value = %d\n",value); close(fd); return 0; }3. 总结
到此为止,Linux下的I2C设备驱动基本编写过程已经讲述完毕,以后凡是拿到新的芯片,需要在Linux下读写I2C寄存器,均可参考本系列的代码进行编写。当然,这里只是讲述了I2C设备驱动编写的一些最基本的方法,关于I2C设备驱动的原理部分并没有涉及,希望自己以后更加深入地了解了Linux设备驱动原理后再进一步阐述。