小弟我现在要用ZLG7290芯片设计一款IIC键盘驱动,通过S3C2440的IIC接7290,内核是2.6.13,那位大哥有代码共享,有类似代码也可以,
刚开始我在linux2.6.13内核的目kernel/driver/i2c/busses目录下,找到了S3C2410的I2C驱动源程序:i2c-s3c2410.c,不知道你所说的针对S3C2410的I2C驱动程序是不是这个,还是i2c文件夹下的所有源程序。我仔细研究了i2c-s3c2410.c程序,发现这个程序包了很多层,因为我之前一直学习的是linux2.4.18,2.6的驱动结构比2.4的变化很大,目前感觉linux自带的I2C驱动太庞大,不知从何下手修改,考虑到I2C的原理还是比较简单的,所以想自己重新写一个I2C驱动程序,但是由于没有经验,所以也不知到如何下手,我要写的驱动程序要达到的目的是:通过S3C2410的I2C控制器和I2C芯片ZLG7290通讯,当ZLG7290所扩展的键盘有键按下时,向CPU发出中断,然后利用I2C通讯,CPU去ZLG7290的寄存器01H中读取键值。
在这里我想问的是那位大侠类似功能基于linux2.6内核的I2C驱动程序(当然源程序最好了),如果有的话能否提供给我,让我做些修改,就可以实现我要的功能。下面我从网上看到的一个别人写的S3C2410的I2C驱动程序(这个程序的网址:http://www.cublog.cn/u/3063/showart_217716.html),我是否可以在这个程序的基础上,做些修改就可以实现我要的功能(不使用Linux自带的I2C驱动),各位大侠在这里能给我指指方向,或者直接给个框架让我修改修改,自己编程能力实在太差,只会修改了,真是郁闷。
我的邮箱:panwsecjtu@yahoo.com.cn
QQ:157456260
希望能得到高手的指点!
你要实现的功能比那个程序简单多了
struct IIC_dev{
wait_queue_head_t rq; // 读取等待队列
uint8_t *buffer;
uint32_t size;
uint32_t index;
struct semaphore sem;
struct cdev cdev;
};
可以简化为
struct IIC_dev{
wait_queue_head_t rq; // 读取等待队列
struct semaphore sem;
struct cdev cdev;
};
因为你不需要在缓冲区中保存键值
sem实现对IIC设备的互斥访问
rq实现IIC_read和中断任务的同步操作
应用层任务循环调用IIC_read,此时无按键信息,应用层任务挂起等待
当有按键按下时,7290产生IIC中断,中断服务程序up等待队列,唤醒IIC_read
其读取键值后返回,处理完相关按键信息后,应用层任务再次调用IIC_read,等待下一次按键的到来
将那个代码简化下就完全可以实现你的功能了,不要总是指望大家给你现成的代码
任意一个简单的字符设备驱动程序,只要含有一个中断任务和一个read方法就可以实现了
当你学会了借鉴模仿时,一切都将变得很简单,这些都是应该培养的学习能力
看看I2C的时序和器件手册
不要看太深的代码方式
研究CPU的器件手册关于I2C控制器的部分 按照时序可以实现自己的功能
可以采用中断服务程序的方式通过信号量来控制read任务
如果嫌自己研究器件手册太慢的话可以在针对该CPU在网上找一些源代码改改
vxWorks之类的也可以呀
道理都是一样的
如果任务不是很着急的话 建议按照器件手册自己写一个
这样更有助于学习CPU的工作原理 而且可以提高自信 对以后的学习和发展都有好处
呵呵,跟楼主一样在弄这个芯片,用在STM32上面,裸机的,比楼主的简单多了。
不过还是难倒我了,I2C不稳定啊