没有做过比这版更烂的开发,坑还在,开发还在继续,记一下笔记吧,或许找到一些灵感。
先用 mtk-openwrt-sdk-20160324-8f8e4f1e.tar.bz2 这版官方SDK(从官方网站上看这是最新的一版openwrt SDK,2016年的,是的,你没看错),然后i2c都巨艰难的调试出来,因为makefile里dev-i2c.o都被屏蔽了,坑。再接着发现虽说kernel 是 linux-3.10.14,但驱动写法居然是2.6,连dts设备树都没有。
换开源的lede-17.01,有设备树,熟悉的感觉。复制target\linux\ramips\dts\MT7628.dts到自己创建的设备树文件,修改target/linux/ramips/image/mt7628.mk 增加自己的产品平台。在根节点增加 :
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "Audio-I2S";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-master = <&dailink0_master>;
simple-audio-card,frame-master = <&dailink0_master>;
simple-audio-card,widgets =
"Microphone", "Microphone Jack",
"Headphone", "Headphone Jack";
simple-audio-card,routing =
"LINPUT1", "Microphone Jack",
"RINPUT1", "Microphone Jack",
"Headphone Jack", "HP_L",
"Headphone Jack", "HP_R";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,cpu {
sound-dai = <&i2s>;
};
dailink0_master: simple-audio-card,codec {
sound-dai = <&codec>;
};
};
enable i2c i2s,并在i2c下挂上 wm8960:
&i2c {
status = "okay";
codec: wm8960@1a {
#sound-dai-cells = <0>;
compatible = "wlf,wm8960";
reg = <0x1a>;
wlf,shared-lrclk;
};
};
&i2s {
status = "okay";
#sound-dai-cells = <0>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&wm8960_mclk_pins>;
};
接着配置pinctrl了:
i2s_pins: i2s {
i2s {
ralink,group = "i2s";
ralink,function = "i2s";
};
};
wm8960_mclk_pins: wm8960_mclk {
wm8960_mclk {
ralink,group = "refclk";
ralink,function = "refclk";
};
};
结果是未找到声卡,怀疑是pinctrl配置和硬件有差异,待查验。同时由于wifi驱动比较难在这版SDK上移植过来,遂放弃这版SDK。
找到官方SDK MediaTek_APSoC_SDK5030_20170331.tar.bz2, 看了下代码,跟官方openwrt差不多,在3.10kernel上用2.6的写法。由于其他开发组需要很多应用是基于openwrt的,官方SDK只做参考,不做开发了。
突然听闻有人在开源分支chaos_calmer上配置7688音频成功了。下载编译调试,如果7628也是配置成功的,那就找到配置的关键点了,但最终结果是未找到声卡。这版SDK更奇葩一点,部分硬件资源放在dts上,部分写在C代码里。因为未配置7628音频成功,不继续下去了,专心弄官方的openwrt SDK。
小道消息知道,江湖上还流传着 mtk-openwrt-sdk-20170518-1443366e.tar.xz 这版SDK。遂专心在这版上开发调试,i2c,i2s,codec的节点都生成出来了,但还是功亏一篑。下面记录下这版开发的一些笔记吧。
1. 修改uboot和kernel波特率为115200:
uboot/src/include/configs/rt2880.h
#define CONFIG_BAUDRATE 115200
linux-3.10.14/arch/mips/ralink/cmdline.c
char rt2880_cmdline[]="console=ttyS1,115200n8 root=/dev/mtdblock5";
2. GPIO的配置方式。
调试外设第一步应该知道GPIO是如何配置的。找到MTK 的gpio 驱动文件 drivers/char/ralink_gpio.c,并不是按照linux的gpio子系统那套写法,这年头见到这种写法也是比较难得的,够奇葩。里面注册字符设备和配置GPIO复用。
int __init ralink_gpio_init(void)
register_chrdev(ralink_gpio_major, RALINK_GPIO_DEVNAME,&ralink_gpio_fops); --- 注册字符设备
gpiomode = le32_to_cpu(*(volatile u32 *)(RALINK_REG_GPIOMODE));
gpiomode |= RALINK_GPIOMODE_DFT; --- 配置GPIO复用方式
*(volatile u32 *)(RALINK_REG_GPIOMODE) = cpu_to_le32(gpiomode); --- 写到寄存器
在 arch/mips/include/asm/mach-ralink/rt_mmap.h 里定义了基地址:
#define RALINK_SYSCTL_BASE 0xB0000000
#define RALINK_PIO_BASE 0xB0000600
#define RALINK_I2C_BASE 0xB0000900
#define RALINK_I2S_BASE 0xB0000A00
在 drivers/char/ralink_gpio.h定义了GPIO相关头