1.修改DTS文件
首先确保系统中启动/dev/ttyS2,先修改dts文件。
1)确保 ./target/linux/ramips/dts/mt7628an.dtsi
中有如下代码
uart2: uart2@e00 {
compatible = "ns16550a";
reg = <0xe00 0x100>;
reg-shift = <2>;
reg-io-width = <4>;
no-loopback-test;
clock-frequency = <40000000>;
resets = <&rstctrl 20>;
reset-names = "uart2";
interrupt-parent = <&intc>;
interrupts = <22>;
pinctrl-names = "default";
pinctrl-0 = <&uart2_pins>;
};
2)在 ./target/linux/ramips/dts/your_device.dts
中添加
&uart2 {
status = "okay";
};
2.修改寄存器
MT7688/7628分为IoT Device Mode和IoT Gateway Mode,即单网口模式和五网口模式。如要使用UART2,则必须使用单网口模式,需要配置的寄存器如下:
其中EPHY_GPIO_AIO_EN设置成digital pad。
1)修改源码方式
在./build_dir/target-mipsel_24kc_musl/linux-ramips_mt76x8/linux-4.14.132/arch/mips/ralink/mt7620.c
中的prom_soc_init
函数中添加
u32 cfg;
cfg = __raw_readl(sysc + 0x3c);
cfg |= 0x0f<<17;
__raw_writel(cfg, sysc + 0x3c);
2)通过/dev/mem方式
先开启/dev/mem支持,make menuconfig
->Global build settings
->Kernel build options
->[*]/dev/mem virtual device support
源码,每次开机时,执行该程序。
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
typedef enum{
IOT_DEV_MODE, //单网口模式
IOT_GATEWAY_MODE //五网口模式
}work_mode_7628_t;
int set_7628_work_mode(work_mode_7628_t mode)
{
int ch;
int mem_fd = open("/dev/mem", O_RDWR|O_SYNC);
if(mem_fd == -1)
{
perror("open /dev/mem");
return -1;
}
int size = 0x100;
int *addr = (int *)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0x10000000);
if(addr == MAP_FAILED)
{
perror("mmap");
return -1;
}
if(mode == IOT_DEV_MODE)
{
*(addr+(0x3c/4)) |= 0x0f<<17;
}
else
{
*(addr+(0x3c/4)) &= ~(0x0f<<17);
}
close(mem_fd);
munmap(addr, size);
return 0;
}