3530|1

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

[求助]关于Linux I2C 驱动 [复制链接]

小弟我最近在做系统移植,需要完成一个kernel2.6下的i2c键盘驱动程序,i2c控制器应该就是使用的s3c2410芯片里的,还用到一个mega8芯片,我猜应该是作为i2c设备接到总线上,并由这个mega8控制i2c总线上的键盘和ic卡读卡器。由于以前没有写过Linux驱动,基本上算是边学边干。现在手头上有一个基于kernel2.4的,可是好像2.4和2.6区别很大,有些地方不太明白,特来向诸位请教,先谢过了!

这个驱动用到的i2c_client结构体里有一个叫做slvRecvNotify的成员函数,感觉好像是使用设备产生中断后,由这个函数来判断是哪一个设备引发中断,可kernel2.6中已经不再使用了,这个函数是如何被调用的呢?kernel2.6中又是如何取代这个操作的呢?

貌似不能上传附件,附上部分代码,如下,还望诸位前辈能不吝赐教~~~小弟感激不尽!


  1. static struct i2c_client mega8_client = {
  2.         flags:                0,
  3.         addr:                MEGA8_I2CADDRESS,
  4.         adapter:        NULL,
  5.         driver:                &i2c_mega8_driver,
  6.         name:                "I2C Mega8",
  7.         id:                1,
  8.         slvRecvNotify:        i2c_mega8_slvRcv,  //???
  9. };
复制代码


  1. static int i2c_mega8_slvRcv( char *buf, int len, int begin)
  2. {
  3.         static int index = 0;
  4.         static I2C_MEGA8_BUFFER frame;
  5.         char *p = frame.m_buffer;

  6.         if(begin==1)        //the first byte of a i2c frame
  7.                 index=0;

  8.         DPRINTK ("mega8 slv Rcv:%d\n",*buf);
  9.         memcpy(p + index, buf, len);
  10.         index += len;
  11.         DPRINTK ("index:%d\n",index);

  12.         if (index >= BUFFER_TYPE_LEN){
  13.                 switch (GetI2C_Devtype(frame.m_cmd)){
  14.                         case        DTYPE_SECURITY:
  15.                                 break;
  16. #ifdef CONFIG_I2C_MEGA8_MATRIX_KEYBOARD
  17.                         case        DTYPE_MKEYB:
  18.                                 if (index >= sizeof (frame.m_kbd)){
  19.                                         DPRINTK ("Request kbd:%d\n", RequestArray[DTYPE_MKEYB]);
  20.                                         if (RequestArray[DTYPE_MKEYB]){
  21.                                                 mega8_kbd_raw((I2C_kbd * )&frame);
  22.                                         }
  23.                                         index = 0;
  24.                                 }
  25.                                 break;
  26. #endif
  27. #if 0//#ifdef CONFIG_I2C_MEGA8_IC_CARD
  28.                         case        DTYPE_ICCARD:
  29.                                 if((frame.m_cmd==CMD_ICC_FAILED && index >= ICCARD_COUNT_FAILED_OFFSET) ||
  30.                                         (index>ICCARD_COUNT_OFFSET && index >= frame.m_iccard.iccard_cnt+ICCARD_COUNT_OFFSET && frame.m_cmd==CMD_ICC_READ)||
  31.                                         (index>=ICCARD_COUNT_OFFSET && frame.m_cmd==CMD_ICC_WRITE) ||
  32.                                         (index >= ICCARD_COUNT_PWD_OFFSET && frame.m_cmd == CMD_ICC_VERIFY) ||
  33.                                         (index >= ICCARD_COUNT_TYPESEL_OFFSET && frame.m_cmd == CMD_ICC_TYPESEL)){
  34.                                         DPRINTK ("Request ic-card:%d\n", RequestArray[DTYPE_ICCARD]);
  35.                                         if (RequestArray[DTYPE_ICCARD]){
  36.                                                 mega8_iccard_raw((I2C_ICCard * )&frame);
  37.                                         }
  38.                                         index = 0;
  39.                                 }
  40.                                 break;
  41. #endif
  42. #if 0 //#ifdef CONFIG_I2C_MEGA8_PS2_0
  43.                         case        DTYPE_PS2_0:
  44.                                 if(index >= sizeof(frame.m_ps2)){
  45.                                         DPRINTK ("Request ps2-0:%d\n", RequestArray[DTYPE_PS2_0]);
  46.                                         if (RequestArray[DTYPE_PS2_0]){
  47.                                                 mega8_ps2_raw0(frame.m_ps2.ps2data);
  48.                                         }
  49.                                         index = 0;
  50.                                 }
  51.                                 break;
  52. #endif
  53. #if 0 //#ifdef CONFIG_I2C_MEGA8_PS2_1
  54.                         case        DTYPE_PS2_1:
  55.                                 if(index >= sizeof(frame.m_ps2)){
  56.                                         DPRINTK ("Request ps2-1:%d\n", RequestArray[DTYPE_PS2_1]);
  57.                                         if (RequestArray[DTYPE_PS2_1]){
  58.                                                 mega8_ps2_raw1(frame.m_ps2.ps2data);
  59.                                         }
  60.                                         index = 0;
  61.                                 }
  62.                                 break;
  63. #endif
  64.                         case        DTYPE_ALL:
  65.                                 break;
  66.        
  67.                 }
  68.         }
  69.         return 0;
  70. }
复制代码
此帖出自Linux开发论坛

最新回复

I2C总线上的器件,都有自己的器件地址。 请注意阅读I2C的协议,例如PCF8563的地址被固化为0x01,等等。注意地址的分配不能重复,否则会引起混乱,无法通讯。 很多控制器集成了硬件的I2C通信模块,并提供了相应的接收中断,发送中断等功能,这个要看具体芯片的datasheet.查阅具体的中断入口地址。 相应的SFR也会明确列出来,所以你要细些阅读datasheet.才能解决你的问题。  详情 回复 发表于 2010-2-10 08:07
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
I2C总线上的器件,都有自己的器件地址。
请注意阅读I2C的协议,例如PCF8563的地址被固化为0x01,等等。注意地址的分配不能重复,否则会引起混乱,无法通讯。
很多控制器集成了硬件的I2C通信模块,并提供了相应的接收中断,发送中断等功能,这个要看具体芯片的datasheet.查阅具体的中断入口地址。
相应的SFR也会明确列出来,所以你要细些阅读datasheet.才能解决你的问题。
此帖出自Linux开发论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表