基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

作者信息

作者: 彭东林

邮箱:[email protected]

QQ:405728433

平台简介

开发板:tiny4412ADK + S700 + 4GB Flash

要移植的内核版本:Linux-4.4.0 (支持device tree)

u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动)

busybox版本:busybox 1.25

交叉编译工具链: arm-none-linux-gnueabi-gcc

(gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29))

摘要

上一篇博文在tiny4412上移植了MMA7660驱动程序,使用的是exynos4412自带的I2C硬件控制器,下面我要说的是用软件模拟一个I2C控制器,用的还是原来的两个GPIO引脚,这不过此时这两个GPIO的功能复用还是GPIO功能。关于这部分可以参考:http://www.cnblogs.com/pengdonglin137/p/4623169.html

移植

Linux内核的驱动分层设计带来好处,我们这里只需要修改I2C控制器的驱动部分,MMA7660的驱动程序部分完全不需要任何改动,而且Linux内核也已经把软件模拟I2C控制器的代码实现好了:drivers/i2c/busses/i2c-gpio.c,我们需要做的只剩下配置设备树了,在arch/arm/boot/dts/exynos4412-tiny4412.dts中添加软件I2C的硬件信息,可以参考:Documentation/devicetree/bindings/i2c/i2c-gpio.txt:

   1: i2c_mma7660: i2c-gpio-0 {
   2:     compatible = "i2c-gpio";
   3:     gpios = <&gpa1 2 GPIO_ACTIVE_HIGH>,    /* SDA */
   4:         <&gpa1 3 GPIO_ACTIVE_HIGH>;    /* SCL */
   5:     /* i2c-gpio,sda-open-drain; */
   6:     /* i2c-gpio,scl-open-drain; */
   7:     i2c-gpio,delay-us = <2>;  /* 250 kHz  */
   8:     #address-cells = <1>;
   9:     #size-cells = <0>;
  10:     status = "okay";
  11:  
  12:     [email protected] {
  13:         compatible = "freescale,mma7660";
  14:         reg = <0x4c>;
  15:         interrupt-parent = <&gpx3>;
  16:         interrupts = <1 2>;
  17:         poll_interval = <100>;
  18:         input_fuzz = <4>;
  19:         input_flat = <4>;
  20:         status = "okay";
  21:     };
  22: };

其中需要关注的:

第3行表示实现SDA信号的GPIO引脚;

第4行表示实现SCL信号的GPIO引脚;

第7行用于控制SCL的频率;

第12-20行还是MMA7660的硬件信息,跟上篇一样,一点都没有变;

下面是SDA和SCL的大致时序图:

可以看到我给udelay设置的值是2,所以周期是4,单位是微秒,所以频率大致是250KHz左右,MMA7660的芯片手册上说I2C的通信速率最大为400KHz,小于这个就可以了:

这部分代码我已经上传到github上了:

git clone https://github.com/pengdonglin137/linux-4.4_tiny4412.git -b port_to_tiny4412

需要执行make menuconfig,将CONFIG_MMA7660_USE_I2C_GPIO设置成y,然后再执行make dtbs。

测试

  • GPIO使用情况
   1: [[email protected] ]# cat /sys/kernel/debug/gpio 
   2: GPIOs 0-7, platform/11400000.pinctrl, gpa0:
   3:  
   4: GPIOs 8-13, platform/11400000.pinctrl, gpa1:
   5:  gpio-10  (                    |sda                 ) in  hi    
   6:  gpio-11  (                    |scl                 ) in  hi    
  • 读取MMA7660的寄存器的值
   1: [[email protected] ]# cd /sys/bus/i2c/drivers/mma7660/9-004c/

   2: [[email protected] 9-004c]# ls
   3: all_axis_g   input        of_node      subsystem    x_axis_g
   4: driver       modalias     power        tilt_status  y_axis_g
   5: hwmon        name         registers    uevent       z_axis_g
   6: [[email protected] 9-004c]# cat all_axis_g 
   7:   3,   0,  22
   8: [[email protected] 9-004c]# cat registers 
   9: REG: 0x00 = 0x02 ...... [ 0000 0010 ]
  10: REG: 0x01 = 0x00 ...... [ 0000 0000 ]
  11: REG: 0x02 = 0x17 ...... [ 0001 0111 ]
  12: REG: 0x03 = 0x01 ...... [ 0000 0001 ]
  13: REG: 0x04 = 0x02 ...... [ 0000 0010 ]
  14: REG: 0x05 = 0xa0 ...... [ 1010 0000 ]
  15: REG: 0x06 = 0xe7 ...... [ 1110 0111 ]
  16: REG: 0x07 = 0x59 ...... [ 0101 1001 ]
  17: REG: 0x08 = 0x49 ...... [ 0100 1001 ]
  18: REG: 0x09 = 0x04 ...... [ 0000 0100 ]
  19: REG: 0x0a = 0x0f ...... [ 0000 1111 ]
  • 查看MMA7660上报事件
   1: [[email protected] 9-004c]# hexdump /dev/input/event0 

   2: 0000000 00b6 0000 f0a8 000d 0003 0002 0016 0000
   3: 0000010 00b6 0000 f0a8 000d 0000 0000 0000 0000
   4: 0000020 00b7 0000 b77c 0001 0003 0000 0002 0000
   5: 0000030 00b7 0000 b77c 0001 0000 0000 0000 0000
   6: 0000040 00b9 0000 3125 0000 0003 0000 0004 0000
   7: 0000050 00b9 0000 3125 0000 0003 0002 0015 0000
   8: 0000060 00b9 0000 3125 0000 0000 0000 0000 0000
   9: 0000070 00b9 0000 df77 000a 0003 0000 0003 0000
  10: 0000080 00b9 0000 df77 000a 0000 0000 0000 0000
  11: 0000090 00b9 0000 ec9b 000d 0003 0000 0002 0000
  12: 00000a0 00b9 0000 ec9b 000d 0000 0000 0000 0000
  13: 00000b0 00ba 0000 3148 0000 0003 0000 0001 0000
  14: 00000c0 00ba 0000 3148 0000 0000 0000 0000 0000
  15: 00000d0 00ba 0000 58af 0009 0003 0002 0014 0000
  16: 00000e0 00ba 0000 58af 0009 0000 0000 0000 0000

未完待续……

时间: 2025-01-07 13:49:17

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)的相关文章

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

基于tiny4412的Linux内核移植 -- 设备树的展开

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

基于tiny4412的Linux内核移植 -- PWM子系统学习(八)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

基于tiny4412的Linux内核移植 -- SD卡驱动移植(五)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 SD卡:Kingston SDHC 4GB 交叉编译工具链: arm-none-linux-gnue

基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 网卡芯片:DM9621NP 交叉编译工具链: arm-none-linux-gnueabi-gcc

基于tiny4412的Linux内核移植 -- PWM子系统学习(七)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

Linux内核调用I2C驱动_以MPU6050为例

Linux内核调用I2C驱动_以MPU6050为例 0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于没有人打扰,有这个奢侈的大块时间,可以一个人安安静静的在教研室看看Linux内核驱动的东西.按照Linux嵌入式学习的进程,SPI驱动搞完了之后就进入到I2C驱动的学习当中,十一还算是比较顺利,I2C的Linux驱动完成了. 为了测试I2C是否好用,选择一个常用的I2C传感器,手头有个MPU6050,刚好作为I2C的

基于Linux3.0.8+smart210的DS18B20驱动移植

Linux内核:Linux3.0.8 硬件:友善之臂smart210开发板,A8内核 编译器:arm-linux-gcc 4.5.1 DS18B20是常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点.工作电压 3.0~5.5V/DC 超低功耗静态功耗<3uA,测温范围 -55℃-+125℃, 测量结果以9~12位数字量方式串行传送. 面对着扁平的那一面,左负右正,一旦接反就会立刻发热,有可能烧毁!同时,接反也是导致该传感器总是显示85℃的原因. DS18B20实物图 DS18

linux内核对网卡驱动多队列的支持

linux的招牌就是它强大的网络功能,稳定,高效,能随着现实的日新月异而日趋完善.众所周知,linux的网卡由结构体net_device表示,一 个该结构体对应一个可以调度的数据包发送队列,注意,这里不谈数据包接收,数据包的实体在内核中以结构体sk_buff表示,这样的话,上述文字就可以用 以下图示来表示: 所谓的网卡对发送数据包的调度指的是多个数据包共享一个网卡的规则,当然就要拥有一系列的约定,比如区分数据包的优先级,区分数据包的类型,内核根据不同的调度策略来对不同的数据包进行排队,然后按照队