IIC Driver for uClinux v0.3

所属分类:嵌入式Linux
开发工具:Unix_Linux
文件大小:22KB
下载次数:49
上传日期:2004-10-19 10:05:35
上 传 者bluebird_3566
说明:  II2c driver for uclinux

文件列表:
IIC Driver for uClinux v0.3 (0, 2003-11-18)
IIC Driver for uClinux v0.3\linu-2.4.x (0, 2003-11-18)
IIC Driver for uClinux v0.3\linu-2.4.x\drivers (0, 2003-11-18)
IIC Driver for uClinux v0.3\linu-2.4.x\drivers\i2c (0, 2003-11-18)
IIC Driver for uClinux v0.3\linu-2.4.x\drivers\i2c\Config.in (2187, 2003-11-11)
IIC Driver for uClinux v0.3\linu-2.4.x\drivers\i2c\i2c-samsung.c (16129, 2003-11-17)
IIC Driver for uClinux v0.3\linu-2.4.x\drivers\i2c\i2c-samsung.h (4390, 2003-11-17)
IIC Driver for uClinux v0.3\linu-2.4.x\drivers\i2c\Makefile (882, 2003-11-11)
IIC Driver for uClinux v0.3\user (0, 2003-11-18)
IIC Driver for uClinux v0.3\user\eden (0, 2003-11-18)
IIC Driver for uClinux v0.3\user\eden\eden.c (3982, 2003-11-17)
IIC Driver for uClinux v0.3\user\eden\i2c-samsung.h (4396, 2003-11-17)
IIC Driver for uClinux v0.3\user\eden\Makefile (443, 2003-11-13)
IIC Driver for uClinux v0.3\user\eden\rtc2sys.c (4642, 2003-11-17)
IIC Driver for uClinux v0.3\user\eden\sys2rtc.c (3704, 2003-11-17)
IIC Driver for uClinux v0.3\user\Makefile (16094, 2003-11-11)
IIC Driver for uClinux v0.3\vendors (0, 2003-11-18)
IIC Driver for uClinux v0.3\vendors\Samsung (0, 2003-11-18)
IIC Driver for uClinux v0.3\vendors\Samsung\4510B (0, 2003-11-18)
IIC Driver for uClinux v0.3\vendors\Samsung\4510B\Makefile (3027, 2003-11-11)

这是V3.0版驱动,在内核驱动里面夹了互斥锁,所以能够满足不同进程读写i2C总线上不同 的器件的要求,接口作了一些修改 V2.0 : typedef struct { int i2c_speed; /*器件支持的最大时钟速率 Hz为单位 */ U8 i2c_slave; /*器件的从地址,如24C***为A0,X1226为DE 注意bit0都无效,那是读写操作用的*/ U8 i2c_addrlen;/*器件寄存器或存储器地址模式,1为8位地址,2为16位地址*/ U8 i2c_operate;/*这个不管*/ int i2c_pagesize;/*器件支持页写方式下的最大字节数,注意,不支持页写的话必须设为1 !!*/ } I2C_INIT_T; typedef struct i2c_chain{ U32 addr; /**要读/写存储器起始地址*/ U8 *buffer; /**交换数据的缓冲起始指针*/ int len; /**需要读/写的长度(字节数)*/ } I2C_CHAIN_T; V3.0 : typedef struct { int i2c_speed; /*器件支持的最大时钟速率 Hz为单位 */ U8 i2c_slave; /*器件的从地址,如24C***为A0,X1226为DE 注意bit0都无效,那是读写操作用的*/ U8 i2c_addrlen;/*器件寄存器或存储器地址模式,1为8位地址,2为16位地址*/ U8 i2c_operate;/*这个不管*/ int i2c_pagesize;/*器件支持页写方式下的最大字节数,注意,不支持页写的话必须设为1 !!*/ } I2C_INIT_T; typedef struct i2c_chain{ I2C_CHAIN_T mode; <<================ 注意这里 !! U32 addr; /**要读/写存储器起始地址*/ U8 *buffer; /**交换数据的缓冲起始指针*/ int len; /**需要读/写的长度(字节数)*/ } I2C_CHAIN_T; 可以看出,模式初始化已经放到读写操作里面去了,不过并不影响操作,因为内核驱动初始化总线是几乎不费时间的, 用户只要将结构里面的mode初始化一次,以后的读写操作只需改变 i2c_chain的addr ,buffer,len直接调用读/写的 IOCTL即可,原来的IOCTL操作的初始化也就不需要了,结构虽然保留在那里,只是一个空操作,可以不再调用。 不同进程分别操作不同类型的器件在互斥锁(说明包含在头文件asm/semaphore.h里面)的协调下,保证每一次 读/写操作i2c总线都只有一个进程有权限,就达到了预期的要求。 希望大家多多帮忙测试!谢谢 V2.0 ============================================================================= 同志们大家好,我是honeyandy chen,很高兴跟大家坐在一起学习uClinux. 本人做嵌入式linux操作系统相关工作已经两年多了,以前都是做Redhat架构的 嵌入式linux,没有接触过uClinux,最近一个月才得到华恒提供的软件包,经过半 个月琢磨,已经在自己设计的4510B的板子上跑起来了,正如我所说的,现在已经 在做一些uClinux没有提供的驱动。我非常愿意把自己的知识和经验与大家分享, 这才是GNU的精神所在。 我以前在PowerPC上做嵌入式Linux,也是一个从无到有的过程,我和另外一位 同事也是朋友自己设计MPC855T的板子,先从基础开发入手,熟悉了Motorola 60x core的基础上,尝试从网上寻找一些免费资源自己做嵌入式Linux,先向大家推荐 一个非常好的机遇PowerPC的嵌入式Linux网站,www.denx.de ,这是一家德国公司 ,我非常佩服德国人的严谨作风,他们改写的代码条理清晰,简洁有效。不久前他 们也开始了ARM的工作,可惜的是他们的起点较高,是从带MMU的ARM920开始的,(Power PC 60x core 也是带MMU的),而我现在只有ARM7的芯片。不过我也感觉到了一个CPU 带有MMU是使一个操作系统灵活,高效的重要因素。所以在熟悉ARM7的构架后,我将 继续研究ARM9,那是我目前的理想目标。正如我前面在论坛里发帖说的一样,我不太 满意uClinux的灵活性,虽然它做比较精简。 好了,不多说了,我简要说明一下刚刚完成,共巷给大家的4510B IIC 内核驱动。 Redhat构架不同的是,uClinux的驱动在shell下不能动态的加载与卸载,所以做在内核 里面要修改一些内核配置文件,因为这个原因,我调试也是很不方便。另外因为我已经 针对自己板子有很多修改,所以不好做patch,请大家多多原谅。 文档目录: 与Readme.txt文件处于同一级目录下有三个目录,分别对应/HHARM4510-R1/uClinux/ 下的目录,大家都明白我指的哪些目录。 1. linux2.4.x/driver/i2c/ ----静态加载的内核驱动 i2c-samsung.h 驱动头文件 i2c-samsung.c 驱动源文件 Makefile Make文件 Config.in 配置菜单文件 如果以前你没有对这些目录下的Makefile或者config.in文件修改过,那么你可以直接将 它们复制到对应目录,有覆盖也无所谓,如果不是,那么你就要查找i2c iic samsung等特征 字符串,对应修改的位置,同样修改就行了。 然后你退到uClinux目录下 make menuconfig,选定制内核选项,退出重新进配置菜单 选择character device -->i2c support --->选中 [*] I2C Samsung 4510B hardware interface 然后保存设置,重新编译内核,在内核引导过程中,在Samsung 串行设备设备始化之前就会 出现i2c-core.o: i2c core module Samsung S3C4510 I2c hardware driver version 0.2 (2003.11.13) 表示驱动加载成功。 2. vendors/Samsung/4510B/ ---- Makefile 在DEVICES = \ tty,c,5,0 console,c,5,1 cua0,c,5,*** cua1,c,5,65 \ \ mem,c,1,1 kmem,c,1,2 null,c,1,3 \ zero,c,1,5 random,c,1,8 urandom,c,1,9 \。。。。。。。。。。。 的最后我添加了与Redhat下一样的i2c字符设备设备文件,主设备号89 i2c,c,89,0 i2c0,c,89,0 i2c1,c,89,1 所以最后你生成的文件系统/dev下就有了对应的设备文件 3. user/eden/ 这是在用户空间调用i2c设备的测试程序,对应的user/Makefile也是为了让最后 生成的文件系统有编译好的可执行文件(这也是我耿耿于怀的,太不方便了)。它们是针对 我的板子IIC总线上的实时时钟芯片X1226(同X1203)写的。 访问i2c总线上的器件的步鄹。先说明的是为了使用方便,我全部采用ioctl操作传递 参数。 首先:需要定义一个结构变量,作为初始化操作参数 typedef struct { int i2c_speed; /*器件支持的最大时钟速率 Hz为单位 */ U8 i2c_slave; /*器件的从地址,如24C***为A0,X1226为DE 注意bit0都无效,那是读写操作用的*/ U8 i2c_addrlen;/*器件寄存器或存储器地址模式,1为8位地址,2为16位地址*/ U8 i2c_operate;/*这个不管*/ int i2c_pagesize;/*器件支持页写方式下的最大字节数,注意,不支持页写的话必须设为1 !!*/ } I2C_INIT_T; I2C_INIT_T i2c_init; 先用open(..)打开/dev/i2c文件 然后初始化 i2c_init.i2c_speed = clk; /** default SCL = 100KHz */ i2c_init.i2c_slave = X1226_CCR_SLAVE; i2c_init.i2c_addrlen = IICADDR2; i2c_init.i2c_pagesize = 1; if(ioctl( fd, CMD_CHAIN_INIT, (unsigned long *)&i2c_init ) <0) DBG("Samsung I2C Init error! errno: %d\n",errno); 初始化做一次就可以了,如果中途不切换其它器件,不需要再做初始化 注意: file = fopen( filename, "r+b")) fd = fileno(file); /*不做转换ioctl操作会失败!!*/ 读写操作时,再定义一个结构变量 typedef struct i2c_chain{ U32 addr; /**要读/写存储器起始地址*/ U8 *buffer; /**交换数据的缓冲起始指针*/ int len; /**需要读/写的长度(字节数)*/ } I2C_CHAIN_T; I2C_CHAIN_T i2c_chain; 然后如此调用 num=8; databuf[0]= 0x40; databuf[1]= 0x13; databuf[2]= 0x99; databuf[3]= 0x21; databuf[4]= 0x06; databuf[5]= 0x03; databuf[6]= 0x06; databuf[7]= 0x20; i2c_chain.addr = 0x0030; i2c_chain.buffer = databuf; i2c_chain.len = num; if(ioctl( fd, CMD_CHAIN_WRITE, (unsigned long *)&i2c_chain ) <0) DBG("Write I2C multi error! errno: %d\n",errno); else { for(count =0; count < num ;count++) DBG("0x%0x ",( U8 )databuf[count]); DBG(" success!\n"); } num=8; for(count =0; count < num ;count++) databuf[ count ]= 0; i2c_chain.addr = 0x0030; i2c_chain.buffer = databuf; i2c_chain.len = num; if(ioctl( fd, CMD_CHAIN_READ, (unsigned long *)&i2c_chain ) <0) DBG("Read I2C multi error! errno: %d\n",errno); else { for(count =0; count < num ;count++ ) printf("0x%0x ",( U8 )databuf[count]); printf(" success!\n"); } 大家可以看我的测试程序参考。 sys2rtc.c rtc2sys.c 是我用RTC的时间与linux系统时间进行校对的,比如rtc2sys就是 用来让每次uClinux启动时自动设置系统时间,你可以修改rc文件完成操作。 这里我就简单介绍,请大家多多帮忙测试,发现什么问题及时通知我,呵呵 因为比较匆忙,源码不是很适合阅读,我会继续整理源码,如果大家在看源码的时候 有什么不明白的,可以到论坛或者email发帖子给我。我的邮箱 honeyandy@thunis.com 另外,i2c-samsung.h头文件里有个#define BEDUG,如果你不屏蔽它,会打出一些 调试信息,这是我调试时用的。 2003.11.13

近期下载者

相关文件


收藏者