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
近期下载者:
相关文件:
收藏者: