• 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

【openwrt】MT7628/7688 openwrt下啟用串口2 UART2入坑指南

01/24 15:09
3334
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

前言

【入坑】MT7628/7688有3個串口, UART0,UART1和UART2, 但使用UART2 時碰到一些問題, MT7628/7688的UART2對應(yīng)的IO口 默認是做網(wǎng)口功能,但未配置或開機狀態(tài),給MT7628/7688的UART2發(fā)送數(shù)據(jù),會發(fā)現(xiàn)發(fā)送,MT7628/7688的UART2就會返回什么。剛開始用MT7628/7688的UART2時,我還以為焊板連錫了,檢查板并沒有連錫短路。后來又檢查電路、查MT7628/7688 的手冊、上網(wǎng)查資料,確定UART2電路沒有錯,是軟件末配置好, openwrt源碼里也沒有相應(yīng)代碼。于是,我們這段歷程寫下來,讓有此問題的小伙伴,少走一些彎路。

MT7628/7688串口簡介

MT7628單網(wǎng)口模式下有3個串口,UART0默認為控制臺使用,UART1和UART2用作和其他設(shè)備通信 。

多網(wǎng)口模式下只有兩個串口,UART0默認為控制臺使用,UART1用作和其他設(shè)備通信。

串口引腳對應(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電路連接原理圖,默認是網(wǎng)口功能,用網(wǎng)口功能時就不能用串口功能。

DTS文件

首先確保系統(tǒ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管腳默認配置為"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源碼,請參看:【Openwrt】開發(fā)環(huán)境搭建 編譯openwrt源碼http://bbs.sunsili.com/thread-175555-1-1.html

2)通過/dev/mem內(nèi)存映射方式

編譯openwrt時,先開啟/dev/mem支持,make menuconfig

->Global build settings
->Kernel build options
->/dev/mem virtual device support

源碼,每次開機時,執(zhí)行該程序。

#include <stdio.h>

#include <stdint.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/mman.h>

 

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_modenr");

set_7628_work_mode(IOT_DEV_MODE);

}

else if(!strcmp(argv[1], "--gateway-mode"))

{

printf("Set gateway modenr");

set_7628_work_mode(IOT_GATEWAY_MODE);

}

else

{

printf("Usage: usemode --iot-mode | --gateay-modenr");

}

}

 

return 0;

}

 

保存編譯、下載到開發(fā)板

具體操作請參閱:

【openwrt應(yīng)用開發(fā)】openwrt交叉編譯自己的應(yīng)用程序入門

在開發(fā)板運行

./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 = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>; 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)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄