前言
【入坑】MT7628/7688有3個(gè)串口, UART0,UART1和UART2, 但使用UART2 時(shí)碰到一些問題, MT7628/7688的UART2對(duì)應(yīng)的IO口 默認(rèn)是做網(wǎng)口功能,但未配置或開機(jī)狀態(tài),給MT7628/7688的UART2發(fā)送數(shù)據(jù),會(huì)發(fā)現(xiàn)發(fā)送,MT7628/7688的UART2就會(huì)返回什么。剛開始用MT7628/7688的UART2時(shí),我還以為焊板連錫了,檢查板并沒有連錫短路。后來又檢查電路、查MT7628/7688 的手冊(cè)、上網(wǎng)查資料,確定UART2電路沒有錯(cuò),是軟件末配置好, openwrt源碼里也沒有相應(yīng)代碼。于是,我們這段歷程寫下來,讓有此問題的小伙伴,少走一些彎路。
MT7628/7688串口簡(jiǎn)介
MT7628單網(wǎng)口模式下有3個(gè)串口,UART0默認(rèn)為控制臺(tái)使用,UART1和UART2用作和其他設(shè)備通信 。
多網(wǎng)口模式下只有兩個(gè)串口,UART0默認(rèn)為控制臺(tái)使用,UART1用作和其他設(shè)備通信。
串口引腳對(duì)應(yīng)關(guān)系表:
UART_RXD0 GPIO#13
UART_TXD0 GPIO#12
UART_RXD1 GPIO#46
UART_TXD1 GPIO#45
UART_RXD2 GPIO#21
UART_TXD2 GPIO#20
MT7628/7688串口2 UART2電路連接原理圖
MT7628/7688串口2 UART2電路連接原理圖,默認(rèn)是網(wǎng)口功能,用網(wǎng)口功能時(shí)就不能用串口功能。
DTS文件
首先確保系統(tǒng)中啟動(dòng)/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>; };
復(fù)制代碼
2)在 ./target/linux/ramips/dts/MT7628.dts中添加
MT7628芯片里面有很多管腳是復(fù)用,這里我們以“spis”功能為例做介紹如何配置JS76x8開發(fā)板的管腳功能復(fù)用。
找到DTS文件中的(源碼目錄下)
./target/linux/ramips/dts/MT7628.dts
spis { ralink,group = "spis"; ralink,function = "pwm_uart2"; }; ...... uart2_pins: uart2 { uart2 { ralink,group = "uart2"; //ralink,function = "pwm"; ralink,function = "uart2"; };
&uart2 { status = "okay"; };
出MT7628芯片的SPIS管腳默認(rèn)配置為"pwm_uart2"功能,具體可以配置哪幾種功能是在
./build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.18.29/arch/mips/ralink/mt7620.c
MT7628/7688串口2 UART2寄存器配置
MT7688/7628分為IoT Device Mode和IoT Gateway Mode,即單網(wǎng)口模式和五網(wǎng)口模式。如要使用UART2,則必須使用單網(wǎng)口模式,需要配置的寄存器如下:
其中EPHY_GPIO_AIO_EN設(shè)置成digital pad。
1)修改內(nèi)核源碼方式
在./build_dir/target-mipsel_24kc_musl/linux-ramips_mt76x8/linux-4.14.132/arch/mips/ralink/mt7620.c中的prom_soc_init函數(shù)中添加
u32 cfg;
cfg = __raw_readl(sysc + 0x3c);
cfg |= 0x0f<<17;
__raw_writel(cfg, sysc + 0x3c);
復(fù)制代碼
編譯openwrt源碼,請(qǐng)參看:【Openwrt】開發(fā)環(huán)境搭建 編譯openwrt源碼http://bbs.sunsili.com/thread-175555-1-1.html
2)通過/dev/mem內(nèi)存映射方式
編譯openwrt時(shí),先開啟/dev/mem支持,make menuconfig
->Global build settings
->Kernel build options
->/dev/mem virtual device support
源碼,每次開機(jī)時(shí),執(zhí)行該程序。
#include#include #include #include #include typedef enum{ IOT_DEV_MODE, //單網(wǎng)口模式 IOT_GATEWAY_MODE //五網(wǎng)口模式 }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; } int main(int argc, char **argv) { work_mode_7628_t wrkMd = IOT_DEV_MODE; if(argc < 2) { set_7628_work_mode(wrkMd); } else { if(!strcmp(argv[1], "--iot-mode")) { printf("Set iot_dev_mode "); set_7628_work_mode(IOT_DEV_MODE); } else if(!strcmp(argv[1], "--gateway-mode")) { printf("Set gateway mode "); set_7628_work_mode(IOT_GATEWAY_MODE); } else { printf("Usage: usemode --iot-mode | --gateay-mode "); } } return 0; }
保存編譯、下載到開發(fā)板
具體操作請(qǐng)參閱:
【openwrt應(yīng)用開發(fā)】openwrt交叉編譯自己的應(yīng)用程序入門
在開發(fā)板運(yùn)行
./usemode --iot-mode Set iot_dev_mode
設(shè)置為iot-dev-mode,如果沒執(zhí)行權(quán)限,需添加執(zhí)行權(quán)限
chmod +x usemode
查看串口2配置
stty -F /dev/ttyS2 speed 9600 baud; line = 0; intr =; quit = ; erase = ; kill = ; eof = ; susp = ; rprnt = ; werase = ; lnext = ; flush = ; min = 1; time = 0; -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo -echoe
接收數(shù)據(jù)
cat /dev/ttyS2&
PC連接usb串口線,打開串口調(diào)試助手
發(fā)送數(shù)據(jù)
echo -e "hello ttys2 " > /dev/ttyS2
審核編輯:湯梓紅
-
原理圖
+關(guān)注
關(guān)注
1297文章
6338瀏覽量
233792 -
串口
+關(guān)注
關(guān)注
14文章
1551瀏覽量
76421 -
OpenWrt
+關(guān)注
關(guān)注
10文章
130瀏覽量
39296 -
UART2
+關(guān)注
關(guān)注
0文章
6瀏覽量
2343
原文標(biāo)題:【openwrt】MT7628/7688 openwrt下啟用串口2 UART2入坑指南
文章出處:【微信號(hào):嵌入式加油站,微信公眾號(hào):嵌入式加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論