标签:
一、硬件平台
1.1 控制器:MT7620(A9内核)
1.2 RTC芯片:MCP7940(I2C总线)
二、软件平台
2.1、开发环境:Ubuntu12.04
2.2、软件版本:openwrt 官方15.05版本SDK开发包(CHAOS CALMER 15.05版本)
三、功能说明
本文章所选择的目标芯片为MT7620,profile 选择的为“Xiaomi MiWiFi Mini ”。
3.1、在openwrt 系统上,移植mcp7940的rtc芯片驱动。
3.2、在openwrt系统上,增加对i2c总线的支持。
注意事项:openwrt系统比较奇怪,在menuconfig配置中,配置了i2c,仍然不能支持。需要另外修改“*.dts”文件,才能支持i2c总线。
四、操作步骤
4.1 增加系统对于 i2c 总线的支持
对于系统增加i2c总线的支持,需要修改2个地方
1、openwrt增加对i2c支持。
2、目标芯片的kernel,增加i2c支持。
3、修改dts文件,增加对i2c支持。
4.1.1 配置openwrt 的I2C
在openwrt 目录下,执行“make menuconfig”命令。
进入菜单 Kernel modules --->I2C support --->,在菜单选项中,配置如图4-1所示。
图4-1 I2C support
4.1.2 配置目标芯片的 I2C
在openwrt 目录下,执行"make kernel_menuconfig"命令,对目标芯片内核进行配置。
进入菜单, Device Drivers ---> I2C support --->,如图4-2所示。
图4-2 目标芯片的I2C总线配置
在图4-2中,选择“I2C Hardware Bus support ---> ”,配置I2C 硬件总线的支持,选择“Ralink I2C Controller”,如图4-3所示。
图4-3 I2C Hardware Bus support
4.1.3 修改DTS配置文件
默认的openwrt系统,没有对I2C总线的支持,需要自己修改DTS配置文件。由于本文章选择的芯片为MT7620A,目标profile 选择的为“Xiaomi MiWiFi Mini”,故需要修改的文件为“XIAOMI-MIWIFI-MINI.dts”
文件的路径为“openwrt/target/linux/ramips/dts/XIAOMI-MIWIFI-MINI.dts”
修改之前的DTS文件:
palmbus@10000000 {
gpio0: gpio@600 {
status = "okay";
};
gpio1: gpio@638 {
status = "okay";
};
gpio2: gpio@660 {
status = "okay";
};
spi@b00 {
status = "okay";
m25p80@0 {
在palmbus节点中,增加MT7620A对I2C总线和RTC芯片的支持,修改之后的DTS文件:
palmbus@10000000 {
gpio0: gpio@600 {
status = "okay";
};
gpio1: gpio@638 {
status = "okay";
};
gpio2: gpio@660 {
status = "okay";
};
i2c@900 {
compatible ="ralink,mt7620a-i2c", "ralink,rt2880-i2c";
reg= <0x900 0x100>;
resets = ;
reset-names= "i2c";
#address-cells = <1>;
#size-cells= <0>;
status= "okay";
rtc@6f {
compatible = "mcp,mcp7940";
reg = <0x6f>;
};
};
spi@b00 {
status = "okay";
m25p80@0 {
说明:
1、i2c@900为MT7620A的I2C节点;
2、对于MCP7940芯片,通过查找芯片手册,知道其通信地址为0x6f。如果需要换成其他的芯片,则将对应的地址0x6f都改成其对应的地址即可。
3、对于RTC的名称描述也需要注意,compatible = "mcp,mcp7940",其中mcp7940对应本文5.1章节,驱动程序rtc_mcp7940.c中第93行,“struct
i2c_device_id”中的名称。如果名字不匹配,则会导致驱动程序执行到probe函数不成功,导致rtc驱动加载失败。
static const struct i2c_device_id mcp7940_id[] = {
{ "mcp7940", mcp7940 },
{ }
};
4、如果I2C的引脚,没有设置,则默认可能工作在GPIO模式,特别注意!在本文中的RTC驱动程序,将I2C的引脚设置为了I2C模式,所以在DTS文件中,就没有再设置I2C引脚的工作模式。如果自己的RTC驱动程序中,没有设置I2C引脚,请在DTS文件中设置其工作为I2C模式,以免它默认工作在GPIO模式中!
i2c@900 {
compatible ="ralink,mt7620a-i2c", "ralink,rt2880-i2c";
reg= <0x900 0x100>;
resets = ;
reset-names= "i2c";
#address-cells = <1>;
#size-cells= <0>;
status= "okay";
rtc@6f {
compatible = "mcp,mcp7940";
reg = <0x6f>;
};
};
如果需要修改为ds1307芯片,则只需要将其中的rtc地址和comatible修改即可。ds1307的通信地址为0x68,则修改如下:
rtc@68 {
compatible = "dallas,ds1307";
reg = <0x68>;
};
4.2 增加对RTC的支持
openwrt系统增加对RTC的支持,需要两个操作:
1、修改target文件,增加RTC支持。
2、修改内核配置,增加RTC支持和配置。
4.2.1 修改target文件
系统在./scripts/medatata.pl中判断并处理RTC_SUPPORT开关,分析之后,原来是在 target/linux/ramips/mt7620/target.mk中,将原始的内容:
FEATURES+=usb
修改为:
FEATURES+=usb rtc
即可打开mt7620对rtc的支持。修改之后,target.mk内容如下:
#
# Copyright (C) 2009 OpenWrt.org
#
SUBTARGET:=mt7620
BOARDNAME:=MT7620 based boards
ARCH_PACKAGES:=ramips_24kec
FEATURES+=usb rtc
CPU_TYPE:=24kec
CPU_SUBTYPE:=dsp
DEFAULT_PACKAGES += kmod-rt2800-pci kmod-rt2800-soc
define Target/Description
Build