作者信息

作者: 彭东林

邮箱:pengdonglin137@163.com

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:     mma7660@4c {

  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: [root@tiny4412 ]# 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: [root@tiny4412 ]# cd /sys/bus/i2c/drivers/mma7660/9-004c/

   2: [root@tiny4412 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: [root@tiny4412 9-004c]# cat all_axis_g 

   7:   3,   0,  22

   8: [root@tiny4412 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: [root@tiny4412 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

未完待续……

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

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

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

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

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  3. 基于tiny4412的Linux内核移植 -- 设备树的展开【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...

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

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  5. 基于tiny4412的Linux内核移植(支持device tree)(一)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  6. 基于tiny4412的Linux内核移植(支持device tree)(三)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  7. 基于tiny4412的Linux内核移植 --- aliases节点解析

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  8. 基于tiny4412的Linux内核移植 --- aliases节点解析【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/5252348.html 阅读目录(Content) 作者信息 平台简介 正文 回到顶部(go to top) ...

  9. 基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植

    一.移植环境:        1.主机:Ubuntu 10.10发行版        2.目标机:FS_S5PC100平台        3.交叉编译工具:arm-cortex_a8-linux-gn ...

随机推荐

  1. MySQL的慢查询分析

    慢查询分析日最初是用来捕获比较“慢”的查询,在mysql5.1 + 版本中,慢查询的功能被加强,可以通过设置long_query_time为0来捕获所有的查询,而且查询的响应时间已经可以做到微妙级别. ...

  2. memcpy memmove区别和实现

    memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...

  3. Splunk - 如何在WebFramework之CORS模式下你的网站和splunk web进行交互

    1. 修改配置文件以支持CORS 进入/Applications/Splunk/etc/system/local 修改server.conf 在最后加入如下: [httpServer]crossOri ...

  4. android国际化(多语言)

    2013-03-18 23:45             13390人阅读             评论(0)             收藏              举报 1.  很大程度上,为什么 ...

  5. C# inline-hook / api-hook

    我查阅了一下相关C#方面的资料,却没有发现有提供过关于api-hook方面的资 料包括应用库由此本人编写一套inline-hook的库用于支持x64.x86上的基于在 clr的公共语言,如: c#.c ...

  6. 用Java实现约瑟夫环

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重 ...

  7. [转载] Redis

    转载:http://snowolf.iteye.com/blog/1630697 大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满 ...

  8. 解决Windows Server2008 R2中IE开网页时弹出阻止框(Windows Server2008网页无法打开的问题)

    相信使用Windows Server2008的朋友都遇到过这种情况,用IE打开网站时会弹出“Internet Explorer增强安全配置正在阻止来自下列网站的此应用程序中的内容”的对话框.如下图所示 ...

  9. Difference between Satisfiable, Valid, Unsatisfiable & Invalid

    A formula is satisfiable if it is possible to find an interpretation (model) that makes the formula  ...

  10. R语言之词云:wordcloud&wordcloud2安装及参数说明

    一.wordcloud安装说明 install.packages("wordcloud"); 二.wordcloud2安装说明 install.packages("dev ...