日期:2014-05-16  浏览次数:20784 次

I2c能否通过mmap读写
现在要做一个I2C的键盘的控制程序,我想直接在用户态写比较简单.
C/C++ code

#define I2C0_REG_BASE         (0x01C22000)
m_nFd = open("/dev/mem", O_RDWR); 
m_pBaseAddr = (i2c_regs_t *)mmap(0, sizeof(i2c_regs_t), PROT_READ | PROT_WRITE, MAP_SHARED, m_nFd,
        (0x00000000+I2C0_REG_BASE ) >>0 );

在I2C 的读写函数中,总是死在红色的位置
 // transmit data one byte at a time.
      for (i = 0; i < in_length; i++)
      {
         i2c->ICDXR = src_buffer[i];
 
         // wait for data to be copied to shift register.
         cnt = 0;
         do
         {
             
            if (cnt++ > I2C_TIMEOUT)
            {
               // timed out waiting for data...reinit and return error.
               //I2C_init(i2c, g_clock_rate);
              // return (ERR_TIMEOUT);
            }
         } [color=#FF0000]while (!CHKBIT(i2c->ICSTR, ICXRDY));[/color]
      }




我的内核是2.6.33.rc4 板子OMAPL138, arm-926ejs+DSP, DDR内存起始区域 0xc0000000. 键盘控制芯片TCA8418
这种方法可不可以,
如果可以0x00000000 是不是要换成0xc000000(也不行)
还有我看有人说显存的例子,offset写a00000, 我把地址>>12 或>>8也不行.



------解决方案--------------------
都不支持你的设备,你有什么办法,你只能自己添加进去了。
------解决方案--------------------
不过你竟然用了内存映射,就不应该在使用read()和write()来读写数据了.