MT7621有三个串口,项目需要将三个串口都使能;

首先按照openwrt的方法修改DTS文件来使能串口2和串口3是不行的,经试验,还是要按照MTK传统的方法,修改内核源码来解决;不同SDK版本可能不一定相同,因此仅供参考。

一)首先修改gpio mode使能串口2和串口3;

原厂SDK,默认串口3是不使能的;需要通过修改ralink_gpio.h和ralink_gpio.c来先将串口3使能;

linux-ramips_mt7621/linux-3.10.14-p112871/drivers/char/ralink_gpio.h

下面是#define RALINK_GPIOMODE_UART3 和 #define RALINK_GPIOMODE_UART2的默认定义

#elif defined (CONFIG_RALINK_MT7621)

#define RALINK_GPIOMODE_UART1               0x02

#define RALINK_GPIOMODE_I2C             0x04

#define RALINK_GPIOMODE_UART3               0x08

#define RALINK_GPIOMODE_UART2               0x20

#define RALINK_GPIOMODE_JTAG                   0x80

#define RALINK_GPIOMODE_WDT                   0x100

#define RALINK_GPIOMODE_PERST                 0x400

#define RALINK_GPIOMODE_MDIO                 0x1000

#define RALINK_GPIOMODE_GE1           0x4000

#define RALINK_GPIOMODE_GE2           0x8000

#define RALINK_GPIOMODE_SPI             0x10000

#define RALINK_GPIOMODE_SDXC                  0x40000

#define RALINK_GPIOMODE_ESWINT             0x100000

#elif defined (CONFIG_RALINK_MT7628)

根据手册中的说明,如果要使能串口2和串口3的话,修改如下

//#define RALINK_GPIOMODE_UART3            0x08

//#define RALINK_GPIOMODE_UART2            0x20

#define RALINK_GPIOMODE_UART3               0x00

#define RALINK_GPIOMODE_UART2               0x00

另外一个宏是RALINK_GPIOMODE_DFT,定义了板子默认的GPIOMODE;可以根据自己的需求进行修改;

// if you would like to enable GPIO mode for other pins, please modify this value

// !! Warning: changing this value may make other features(MDIO, PCI, etc) lose efficacy

#if defined (CONFIG_RALINK_MT7621)

#define RALINK_GPIOMODE_DFT            (RALINK_GPIOMODE_UART2 | RALINK_GPIOMODE_UART3 | RALINK_GPIOMODE_WDT)

#elif defined (CONFIG_RALINK_MT7620)

#define RALINK_GPIOMODE_DFT            (RALINK_GPIOMODE_I2C)

#elif defined (CONFIG_RALINK_MT7628)

#define RALINK_GPIOMODE_DFT            (RALINK_GPIOMODE_UART2 | RALINK_GPIOMODE_UART3) | (RALINK_GPIOMODE_SPI_CS1) | (RALINK_GPIOMODE_WDT)

#else

#define RALINK_GPIOMODE_DFT             (RALINK_GPIOMODE_UARTF)

#endif

在ralink_gpio.c中它在如下地方使用到;

int __init ralink_gpio_init(void)

{

unsigned int i;

u32 gpiomode;

……

//config these pins to gpio mode

gpiomode = le32_to_cpu(*(volatile u32 *)(RALINK_REG_GPIOMODE));

#if !defined (CONFIG_RALINK_RT2880)

gpiomode &= ~0x1C;  //clear bit[2:4]UARTF_SHARE_MODE

#endif

#if defined (CONFIG_RALINK_MT7620)

gpiomode &= ~0x2000;  //clear bit[13] WLAN_LED

#endif

#if defined (CONFIG_RALINK_MT7621)

gpiomode &= ~0x3C;  //clear bit[2:6]UART2_SHARE_MODE UART3_SHARE_MODE

#endif

gpiomode |= RALINK_GPIOMODE_DFT;

*(volatile u32 *)(RALINK_REG_GPIOMODE) = cpu_to_le32(gpiomode);

二)在init.c中创建对应的串口设备

1)串口的中断号在如下文件中定义

surfboardint.h

#define SURFBOARDINT_UART_LITE1  26     /* UART Lite */

#define SURFBOARDINT_UART_LITE2  27     /* UART Lite */

#define SURFBOARDINT_UART_LITE3  28     /* UART Lite */

#define SURFBOARDINT_UART        SURFBOARDINT_UART_LITE2 //ttyS0

#define SURFBOARDINT_UART1       SURFBOARDINT_UART_LITE1 //ttyS1

2)修改init.c

linux-ramips_mt7621/linux-3.10.14-p112871/arch/mips/relink/init.c中

static struct uart_port serial_req[3];

__init int prom_init_serial_port(void)

{

……

#if defined (CONFIG_RALINK_MT7621)

serial_req[2].type       = PORT_16550A;

serial_req[2].line       = 2;

serial_req[2].irq        = SURFBOARDINT_UART_LITE3;

serial_req[2].flags      = UPF_FIXED_TYPE;

serial_req[2].uartclk    = 50000000;

serial_req[2].iotype     = UPIO_MEM32;

serial_req[2].regshift   = 2;

serial_req[2].mapbase    = RALINK_UART_LITE3_BASE;

serial_req[2].membase    = ioremap_nocache(RALINK_UART_LITE3_BASE, PAGE_SIZE);

early_serial_setup(&serial_req[2]);

#endif

以及修改prom_get_ttysnum和serial_setbrg这两个函数,增加对串口3的描述;

三)修改CONFIG_SERIAL_8250_RUNTIME_UARTS

通过配置内核,以让串口驱动支持串口3

drivers\tty\serial\8250\8250_core.c

static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;

通过“make  kernel_menuconfig”修改系统串口数量 CONFIG_SERIAL_8250_RUNTIME_UARTS

#

# Serial drivers

#

CONFIG_SERIAL_8250=y

# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set

CONFIG_SERIAL_8250_CONSOLE=y

# CONFIG_SERIAL_8250_PCI is not set

CONFIG_SERIAL_8250_NR_UARTS=4

CONFIG_SERIAL_8250_RUNTIME_UARTS=2

# CONFIG_SERIAL_8250_EXTENDED is not set

# CONFIG_SERIAL_8250_DW is not set

# CONFIG_SERIAL_8250_RT288X is not set

static void __init serial8250_isa_init_ports(void)

{

struct uart_8250_port *up;

static int first = 1;

int i, irqflag = 0;

if (!first)

return;

first = 0;

if (nr_uarts > UART_NR)

nr_uarts = UART_NR;

for (i = 0; i < nr_uarts; i++) {

struct uart_8250_port *up = &serial8250_ports[i];

struct uart_port *port = &up->port;

MT7621原厂openwrt SDK使能串口2和串口3相关推荐

  1. RT5350原厂SDK及AP移植步骤详解

    最近想搞一下rt5350,所以找了个原厂的SDK包进行了编译,很快路由器就可以用了,把我的编译操作步骤写了下分享给更多的爱好者,供大家参靠,下一步准备移植摄像头玩玩.有兴趣的可以一起交流. RT535 ...

  2. 20230126使AIO-3568J开发板在原厂Android11下跑起来

    20230126使AIO-3568J开发板在原厂Android11下跑起来 2023/1/26 18:22 1.前提 2.修改dts设备树 3.适配板子的dts 4.(修改uboot)编译系统烧入固件 ...

  3. Linksys WRT路由器刷入OpenWrt与原厂固件双固件及切换

    Linksys路由器OpenWrt与原厂固件双固件刷入及切换 双固件机制 使用原厂固件刷其他固件 使用原厂固件切换启动分区 使用OpenWrt刷入Sysupgrade 使用OpenWrt刷入Img 使 ...

  4. openwrt的两种固件类型:factory原厂固件、sysupgrade固件

    factory多了一些验证的东西,用于在原厂固件的基础上进行升级. 普通家用路由一般不是openwrt固件,如果要将家用路由升级为openwrt固件,就可以用factory刷到路由上.sysupgra ...

  5. STM32芯片替代方案 | 从原厂资料中获取GD32F103VET6通信串口接口电路设计 | 第五集

    辉光管需要用到WiFi通信进行时间的更新,从网络中获取时间数据,所以需要使用串口通信.在一键下载电路中已经使用了串口0.所以单片机和WiFi的串口需要选择其他编号. STM32芯片串口接口引脚的确定 ...

  6. 不用TTL线,OpenWrt刷回原厂或其他系统方法 841n测试通过

    今天刷OpenWrt后不能获取ip了,跟砖差不多了.折腾了好长时间总算把路由器搞好了.下边给大家分享一下方法. OpenWrt出问题后可以进入安全模式启动: 修复一次本地连接让系统清MAC表,拔掉路由 ...

  7. 刷OPENWRT后悔了,刷回原厂固件教程

    之前之所以要刷固件,是因为上网时经常将网页重定向到路由器的管理员界面,如果你也有这种问题,那么不用刷了,直接找售后换货或退货,这是路由器质量问题,刷机没法解决. 原文:http://www.sjyyt ...

  8. 水星路由器 Mercury MER1200G刷机教程,Archer C5V4刷回原厂固件,串口(TTL)刷机,需要一个USB转TTL工具

    1. 准备工作: 硬件工具: 1.USB转TTL CH340模块 2.2.54mm间距4P单排排针 以上东西网上购买即可,2个加起来不到5块钱,还包邮. 软件工具: 1.sscom5.13.exe 2 ...

  9. 703N V1刷OpenWrt再刷回原厂教程(无图版)

    先申明: 我的703N是TL-WR703N V1.2,亲测成功,其它版本不敢保证,刷死了别找我- 特别提醒: 不管刷哪个版本的固件,请先将路由上的其它网络断开,包括内网和外网,否则一切后果自负- 我所 ...

最新文章

  1. AI论文中的novelty如何评价?
  2. flatmap 与map 的区别 java_map和flatmap的区别+理解、学习与使用 Java 中的 Optional
  3. Hive 外部表关联分区数据
  4. Caret模型训练和调参更多参数解读(2)
  5. Java学习笔记1.2.1 使用Java集成开发环境 - Eclipse
  6. C++中的getline函数
  7. 常见的大数据技术类型有哪些
  8. DBM经历(六)UAT了
  9. 无需易语言模块实现任何组件透明加自汇皮肤效果
  10. Hololens2开发 登录设备网页第三方观看忘记密码怎么办
  11. jquery1.7版本核心模块测试封装
  12. 【猿说VUE】初试模板语法,开启VUE编码之旅
  13. tomcat 配置域名和ssl证书
  14. css浮动,清除浮动,溢出属性,定位,设置透明度
  15. Library\PackageCache\com.unity Error (are you missing a using directive or an assembly reference?)
  16. 百万基建狂魔们的赛博世界
  17. o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task
  18. 全国大中学生体测取消选测 长跑成为必测项目
  19. 磁场强度单位和磁感应强度单位转换
  20. 安装 Cloudera Manager、CDH、KUDU 随手记

热门文章

  1. 音视频开发: ffmpeg采集桌面屏幕、摄像头保存为视频
  2. APP按下home键恢复到登录(主界面)
  3. 想要改变客户态度 这些销售话术需掌握
  4. 《持续集成实践指南》第1章 DevOps实践简介
  5. 散列表--双散列、再散列与可扩散列
  6. matlab两曲面的交线,MATLAB画曲线交点和曲面交线
  7. linux根据修改日期删除,在Linux下怎么一次性删除掉那些修改时间为指定日期的所有文件?...
  8. java计算机毕业设计ssm基于SSM学生信息管理系统37myx(附源码、数据库)
  9. FBG光纤反射器,FTTX网络链路监控的理想光端
  10. 天梯赛HBU训练营——链表去重 (25分)(测试点2和段错误解决)