[国嵌攻略][156][I2C自编设备驱动设计]
AT24C08的驱动在Linux内核中已经提供,在/drivers/misc/eeprom/at24.c文件中。在对应的probe函数中有一个创建/sys/.../eeprom文件的函数,应用程序通过调用/sys/.../eeprom设备文件来对设备进行读写操作。
移植AT24C08驱动
1.修改内核注册eeprom设备
在kernel/linux-mini2440/arch/arm/mach-s3c2440.c中的machine_init下注册IIC设备。
mach-mini2440.c
static struct at24_platform_data at24c08 = { .byte_len = 8192 / 8, //字节长度 .page_size = 8, //每页大小 .flags = 0 }; static struct i2c_board_info __initdata mini2440_i2c_devices[] = { { I2C_BOARD_INFO("24c08", 0x50), //"24c08"表示型号,0x50表示地址 .platform_data = &at24c08 } }; static void __init mini2440_machine_init(void){ i2c_register_board_info(0,mini2440_i2c_devices,ARRAY_SIZE(mini2440_i2c_devices)); }
2.配置内核支持eeprom驱动
make menuconfig ARCH=arm
device drivers->[*]misc devices->eeprom support->
<*>i2c eeproms form most venders->exit->save
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
3.下载内核到开发板
/sys/bus/i2c/devices/0-0050/eeprom文件就是内核注册的eeprom设备文件。0x50对应0-0050文件夹,24c08对应eeprom文件。
i2capp.c
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char **argv){ //打开文件 int fd; fd = open("/sys/bus/i2c/devices/0-0050/eeprom", O_RDWR); if(fd < 0){ printf("error\n"); return -1; } //写入数据 int i; unsigned char wrData[10]; for(i = 0; i < 10; i++){ wrData[i] = i; } lseek(fd, 0, SEEK_SET); write(fd, wrData, 10); //读取数据 unsigned char rdData[10]; lseek(fd, 0, SEEK_SET); read(fd, rdData, 10); for(i = 0; i < 10; i++){ printf("%d ", rdData[i]); } printf("\n"); //关闭文件 close(fd); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术