谷动谷力

 找回密码
 立即注册
查看: 2908|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
发表于 2023-10-27 12:00:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
【openwrt】MT7628/7688 openwrt下启用串口2 UART2入坑指南


前言

【入坑】MT7628/7688有3个串口,  UART0,UART1和UART2,  但使用UART2 时碰到一些问题, MT7628/7688的UART2对应的IO口 默认是做网口功能,但未配置或开机状态,给MT7628/7688的UART2发送数据,会发现发送,MT7628/7688的UART2就会返回什么。刚开始用MT7628/7688的UART2时,我还以为焊板连锡了,检查板并没有连锡短路。后来又检查电路、查MT7628/7688 的手册、上网查资料,确定UART2电路没有错,是软件末配置好, openwrt源码里也没有相应代码。于是,我们这段历程写下来,让有此问题的小伙伴,少走一些弯路。

MT7628/7688串口简介

MT7628单网口模式下有3个串口,UART0默认为控制台使用,UART1和UART2用作和其他设备通信 。
多网口模式下只有两个串口,UART0默认为控制台使用,UART1用作和其他设备通信。
串口引脚对应关系表:
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电路连接原理图,默认是网口功能,用网口功能时就不能用串口功能。




DTS文件

首先确保系统中启动/dev/ttyS2,先查看修改dts文件。

1)确保 ./target/linux/ramips/dts/mt7628an.dtsi中有如下代码
  1.   uart2: uart2@e00 {
  2.                         compatible = "ns16550a";

  3.                         reg = <0xe00 0x100>;
  4.                         reg-shift = <2>;
  5.                         reg-io-width = <4>;
  6.                         no-loopback-test;
  7.                         clock-frequency = <40000000>;
  8.                         resets = <&rstctrl 20>;
  9.                         reset-names = "uart2";
  10.                         interrupt-parent = <&intc>;

  11.                         interrupts = <22>;
  12.                         pinctrl-names = "default";
  13.                         pinctrl-0 = <&uart2_pins>;
  14.                 };
复制代码

2)在 ./target/linux/ramips/dts/MT7628.dts中添加
MT7628芯片里面有很多管脚是复用,这里我们以“spis”功能为例做介绍如何配置JS76x8开发板的管脚功能复用。
找到DTS文件中的(源码目录下)
./target/linux/ramips/dts/MT7628.dts

  1. spis {
  2.                                 ralink,group = "spis";
  3.                                 ralink,function = "pwm_uart2";
  4.                         };
  5. ......
  6. uart2_pins: uart2 {
  7.                         uart2 {
  8.                                         ralink,group = "uart2";
  9.                                 //ralink,function = "pwm";
  10.                                 ralink,function = "uart2";
  11.                                 };
复制代码
  1. &uart2 {
  2.         status = "okay";
  3. };
复制代码

出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
  1. static struct rt2880_pmx_func spis_grp_mt7628[] = {
  2.         FUNC("pwm_uart2", 3, 14, 4),
  3.         FUNC("util", 2, 14, 4),
  4.         FUNC("gpio", 1, 14, 4),
  5.         FUNC("spis", 0, 14, 4),
  6. };
复制代码




MT7628/7688串口2 UART2寄存器配置

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函数中添加
  1. u32 cfg;

  2. cfg = __raw_readl(sysc + 0x3c);
  3. cfg |= 0x0f<<17;
  4. __raw_writel(cfg, sysc + 0x3c);
复制代码
编译openwrt源码,请参看:【Openwrt】开发环境搭建 编译openwrt源码-谷动谷力 (sunsili.com)

2)通过/dev/mem内存映射方式

编译openwrt时,先开启/dev/mem支持,make menuconfig

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

源码,每次开机时,执行该程序。
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <sys/mman.h>

  6. typedef enum{
  7.         IOT_DEV_MODE,           //单网口模式
  8.         IOT_GATEWAY_MODE        //五网口模式
  9. }work_mode_7628_t;

  10. int set_7628_work_mode(work_mode_7628_t mode)
  11. {
  12.         int ch;
  13.         int mem_fd = open("/dev/mem", O_RDWR|O_SYNC);
  14.         if(mem_fd == -1)
  15.         {
  16.                 perror("open /dev/mem");
  17.                 return -1;
  18.         }
  19.         int size = 0x100;
  20.         int *addr = (int *)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0x10000000);
  21.         if(addr == MAP_FAILED)
  22.         {
  23.                 perror("mmap");
  24.                 return -1;
  25.         }

  26.         if(mode == IOT_DEV_MODE)
  27.         {
  28.                 *(addr+(0x3c/4)) |= 0x0f<<17;
  29.         }
  30.         else
  31.         {
  32.                 *(addr+(0x3c/4)) &= ~(0x0f<<17);
  33.         }

  34.         close(mem_fd);
  35.         munmap(addr, size);
  36.         return 0;
  37. }


  38. int main(int argc, char **argv)
  39. {
  40.         work_mode_7628_t wrkMd = IOT_DEV_MODE;

  41.         if(argc < 2)
  42.         {
  43.                 set_7628_work_mode(wrkMd);
  44.         }
  45.         else
  46.         {
  47.                 if(!strcmp(argv[1], "--iot-mode"))
  48.                 {
  49.                         printf("Set iot_dev_mode\n\r");
  50.                         set_7628_work_mode(IOT_DEV_MODE);
  51.                 }
  52.                 else if(!strcmp(argv[1], "--gateway-mode"))
  53.                 {
  54.                         printf("Set gateway mode\n\r");
  55.                         set_7628_work_mode(IOT_GATEWAY_MODE);
  56.                 }
  57.                 else
  58.                 {
  59.                         printf("Usage: usemode --iot-mode | --gateay-mode\n\r");
  60.                 }
  61.         }

  62.         return 0;
  63. }
复制代码

保存编译、下载到开发板
具体操作请参阅:
【openwrt应用开发】openwrt交叉编译自己的应用程序入门-谷动谷力 (sunsili.com)

在开发板运行
  1. ./usemode --iot-mode
  2. Set iot_dev_mode
复制代码

设置为iot-dev-mode,如果没执行权限,需添加执行权限
  1. chmod +x usemode
复制代码

查看串口2配置
  1. stty -F /dev/ttyS2
  2. speed 9600 baud; line = 0;
  3. intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>; min = 1; time = 0;
  4. -brkint -icrnl -imaxbel
  5. -opost
  6. -isig -icanon -iexten -echo -echoe
复制代码
stty应用请查看:【linux】OPENWRT串口通信stty安装使用-谷动谷力 (sunsili.com)
接收数据
  1. cat /dev/ttyS2&
复制代码

PC连接usb串口线,打开串口调试助手

发送数据
  1. echo -e   "hello ttys2 " > /dev/ttyS2
复制代码





+110

最近谁赞过

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-12-27 08:56 , Processed in 0.090267 second(s), 45 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表