首页 > 技术知识 > 正文

环境: Ubuntu 12.04-64bit 硬件平台: Hi3520D_V100 内核版本: linux-3.0.y Qt版本: qt4.8.6 编译器: arm-hisiv100nptl-linux-gcc 作者: MacianYuan 原文链接: https://www.ebaina.com/articles/140000004191

摘要: 1、 在Hi3520平台下,增加UART加载到内核 2、 修改内核文件,制作内核镜像。 3、 增加UART3方法

第一节 修改内核文件,增加UART加载到内核 一、内核配置初始化,拷贝固定内核配置替换现有的配置 //清内核 make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- clean //进入内核根目录下 cd /home/vmuser/sdk/Hi3520D_SDK_V1.0.5.0/osdrv/kernel/linux-3.0.y/ //拷贝.config 文件 cp arch/arm/configs/hi3520d_full_defconfig .config 二、修改内核相关文件 //修改内核相关文件 cd /home/vmuser/sdk/Hi3520D_SDK_V1.0.5.0/osdrv/kernel/linux-3.0.y/arch/arm/mach-hi3520d //编辑core.c 文件 vi core.c (1)管脚复用配置:

(a)管脚复用宏定义

/* 复用寄存器基地址 */ /* 复用寄存器基地址 */ #define REG_UART_BASE_ADDR 0x200F0000 /* UART1_RXD偏移寄存器 */ #define REG_UART1RXD_OFFSET IO_ADDRESS(REG_UART_BASE_ADDR + 0x050) /* UART1_TXD偏移寄存器 */ #define REG_UART1TXD_OFFSET IO_ADDRESS(REG_UART_BASE_ADDR + 0x058) /* UART2_RXD偏移寄存器 */ #define REG_UART2RXD_OFFSET IO_ADDRESS(REG_UART_BASE_ADDR + 0x05C) /* UART2_TXD偏移寄存器 */ #define REG_UART2TXD_OFFSET IO_ADDRESS(REG_UART_BASE_ADDR + 0x060) /* UART端口复用配置 */ #define uart_reuse()({\ writel(0x01,REG_UART1RXD_OFFSET);\ writel(0x01,REG_UART1TXD_OFFSET);\ writel(0x01,REG_UART2RXD_OFFSET);\ writel(0x01,REG_UART2TXD_OFFSET);\ })

(b)《Hi3520D/Hi3515A/Hi3515C H.264 编解码处理器用户指南》(P70)

复用寄存器基地址:

【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核

UART 偏移地址:

【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核1

(2)串口初始化配置

(a)增加uart1、uart2配置信息:

//修改core.c 文件 在第310行uart0配置信息下增加 HIL_AMBA_DEVICE(uart0, “uart:0”, UART0, NULL); HIL_AMBA_DEVICE(uart1, “uart:1”, UART1, NULL); HIL_AMBA_DEVICE(uart2, “uart:2”, UART2, NULL); static struct amba_device *amba_devs[] __initdata = { &HIL_AMBADEV_NAME(uart0), &HIL_AMBADEV_NAME(uart1), &HIL_AMBADEV_NAME(uart2), };

(b)修改串口amba_device 结构体,配置串口初始化:(AMBA:片上总线协议)

//修改core.c 文件 在第323行配置信息下增加 static struct clk_lookup lookups[3]; static void uart_clk_init(unsigned long clk) { uart_clk.rate = clk; lookups[0].dev_id = “uart:0”; lookups[0].clk = &uart_clk; lookups[1].dev_id = “uart:1”; lookups[1].clk = &uart_clk; lookups[2].dev_id = “uart:2”; lookups[2].clk = &uart_clk; uart_reuse(); } (3)增加串口中断配置信息

(a)切换目录,增加irqs.h配置信息

cd /home/vmuser/sdk/Hi3520D_SDK_V1.0.5.0/osdrv/kernel/linux-3.0.y/arch/arm/mach-hi3520d/include/mach //修改irqs.h 文件 第10行 #define UART0_IRQ (HI3520D_IRQ_START + 8) #define UART1_IRQ (HI3520D_IRQ_START + 9) #define UART2_IRQ (HI3520D_IRQ_START + 10) 第二节 配置内核文件,制作内核镜像 三、配置内核

(1)海思加载的串口驱动是PL011,make menuconfig 配置Device Drivers > Character devices > Serial drivers中的ARM AMBA PL011 serial port support 和 Support for console on AMBA serial port

//进入内核配置界面 make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- menuconfig

(2)修改后的结果

【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核2

(3)重新编译内核烧入

//编译内核 make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- uImage //拷贝编译好的内核到指定目录下 cp arch/arm/boot/uImage /mnt/ ping 192.168.100.128 setenv serverip 192.168.100.128 sa

(4)修改tftp服务器和客户端ip地址,通过tftp烧写内核镜像

【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核3

(5)烧写内核

mw.b 82000000 ff 400000 tftp 82000000 uImage sf probe 0 sf erase 100000 400000 sf write 82000000 100000 400000 reset # 重启进入新系统。

(6)烧写结果

【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核4

四、验证串口并应用

在/dev 下可以查看是否有串口设备ttyAMA0~2。 【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核5

第三节 增加UART3方法

由于之前没有增加UART3 ,后在项目中UART1 UART2 都被占用,贴出增加UART3方法。 UART3和上述UART1 UART2相同。主要是在《Hi3520D/Hi3515A/Hi3515C H.264编解码处理器用户指南.pdf》P98 手册中查找到复用引脚。

muxctrl_reg46 GPIO1_0 管脚复用控制寄存器 UART3_TXD 对应普通GPIO1_0 Offset Address 0x0B8

muxctrl_reg47 GPIO1_1 管脚复用控制寄存器 UART3_RXD 对应普通GPIO1_1 Offset Address 0x0BC

【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核6

【海思HI3520之QT开发】-串口通讯实战(一):UART加载到内核7

除此配置与UART1 UART2不同之外,其他都按照UART1 UART2添加即可。

附件:《Hi3520D/Hi3515A/Hi3515C H.264编解码处理器用户指南.pdf》

猜你喜欢