1.遇到的第一个问题,编译固件过大
1.1 配置i2c驱动
make menuconfig
Kernel modules —> I2C support —> <*> kmod-i2c-gpio-custom.
## 1.2编译后固件过大
Openwrt修改flash大小
前言:在我们编辑固件选择软件包的时候会使固件逐渐变大,但是要符合你使用的型号,所以就修改固件大小来改变它。由于openwrt下默认一些固件大小是8M,所以在此来修改成16M,来支持我们的使用。
在新的版本中,已经加了对16M的支持,openwrt/tools/firmware-utils/src/mktplinkfw.c
代码如下
static struct flash_layout layouts[] = {
{
.id = “4M”,
.fw_max_len = 0x3c0000,
.kernel_la = 0x80060000,
.kernel_ep = 0x80060000,
.rootfs_ofs = 0x140000,
}, {
.id = “4Mlzma”,
.fw_max_len = 0x3c0000,
.kernel_la = 0x80060000,
.kernel_ep = 0x80060000,
.rootfs_ofs = 0x100000,
}, {
.id = “8M”,
.fw_max_len = 0x7c0000,
.kernel_la = 0x80060000,
.kernel_ep = 0x80060000,
.rootfs_ofs = 0x140000,
}, {
.id = “8Mlzma”,
.fw_max_len = 0x7c0000,
.kernel_la = 0x80060000,
.kernel_ep = 0x80060000,
.rootfs_ofs = 0x100000,
}, {
.id = “16M”,
.fw_max_len = 0xf80000,
.kernel_la = 0x80060000,
.kernel_ep = 0x80060000,
.rootfs_ofs = 0x140000,
}, {
.id = “16Mlzma”,
.fw_max_len = 0xf80000,
.kernel_la = 0x80060000,
.kernel_ep = 0x80060000,
.rootfs_ofs = 0x100000,
}, {
.id = “16Mppc”,
.fw_max_len = 0xf80000,
.kernel_la = 0x00000000,
.kernel_ep = 0xc0000000,
.rootfs_ofs = 0x2a0000,
}, {
}
};
所以这里就不进行修改了
1.修改dts
文件目录:openwrt/target/Linux/ramips/dts,在该目录下找到自己想要修改的dts文件,这里以mt7620a_mt7610e做示例
修改处dts代码展示:
partition@50000 {
label = "firmware";
reg = <<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x50000
0xfb0000>; }; 值得一提的是,7b=8M fb=16M
2.修改Makefile
文件目录:openwrt/target/linux/ramips/image/Makefile,由于我刚刚修改的是mt7620a_mt7610e,所以找到相关代码
注意,这里是我修改之后的,以前是Default8M,现在改成16M,修改完之后编译,就可以看到你之前由于固件大于8M从而没有被编译出来的固件了。
原文链接:
1.3加载硬件驱动
在编译好固件之后,进入系统,需要加载相应的模块才能加载i2c设备,使用命令:
insmod i2c-dev
如果是 WRTnode2 系列的板子,请使用
insmod i2c-gpio-custom bus0=0,5,4
相关链接:http://wiki.wrtnode.cc/index.php?title=I2C%E7%9A%84%E7%8E%A9%E6%B3%95
修改i2c-gpio-custom.c
volatile unsigned long *GPIOMODE;
volatile unsigned long *GPIO0_31_DIR;
volatile unsigned long *GPIO0_31_DATA;
static int __init i2c_gpio_custom_probe(void)
{
int err;
printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n");
GPIOMODE=(volatile unsigned long *)ioremap(0x10000060,4);
GPIO0_31_DIR=(volatile unsigned long *)ioremap(0x10000600,4);
GPIO0_31_DATA=(volatile unsigned long *)ioremap(0x10000620,4);
*GPIOMODE |= (0x1<<20);
*GPIO0_31_DIR |= (1<<4)|(1<<5);
*GPIO0_31_DATA |= (1<<4)|(1<<5);
err = i2c_gpio_custom_add_one(0, bus0);
2.oled应用程序
管脚配置说明 链接:
https://www.jianshu.com/p/a45edc744275
应用程序
配置:make menuconfig—>utilities–>
下载链接:https://download.csdn.net/download/liupeng08304/11760337 mt7628_oled.zip
3编译运行
insmod i2c-gpio-custom bus0=0,5,4 &oled /dev/i2c-0
4显示效果
5存在问题
对于dts怎么修改io配置不是很了解,不知道哪里有详细的介绍