嵌入式开发修改u-boot与Linux调试串口总结

简介:

近期一个嵌入式开发项目,使用TI Cortex-A8的芯片AM3517作为主控开发。前期使用某公司的核心板搭建开发环境。在自己做底板布板的时候的时候涂个布线方便,改用UART1作为调试串口,而原来某公司给的开发包,已经TI的AM3517 PSP均以UART3作为调试串口。于是在底板焊接完成调试的时候就有了一天痛苦的经历。

嵌入式开发.jpg

在原版的PSP中, 一共有五处使用到UART3作为打印和调试串口:

   (1)Xloader的打印串口

   (2)u-boot的打印串口

   (3)内核解压时的信息打印串口

   (4)内核调试串口

   (5)文件系统中使用的显示终端串口

以上第一处Xloader的打印信息量少且系统中不需要使用,不做修改。本文中讲述后四种情况的修改。

1.1 修改u-boot打印串口

AM3517的串口符合TL16C550标准的,所以驱动也是使用16550的驱动,默认情况下,我们只需要提供需要配置的串口的基地址和中断号等资源给16550的驱动,寄存器的配置不需要我们去关心。且在瑞泰提供开发包中UART1,UART2,UART3引脚配置均配置为M0模式所以不用去修改引脚复用寄存器。仅需在修改u-boot代码中include/configs/am3517_icetek.h的如下代码段:

90 #define CONFIG_CONS_INDEX 3

91 #define CONFIG_SYS_NS16550_COM3 OMAP34XX_UART3

92 #define CONFIG_SERIAL3 1 / UART3 on AM3517 ICETEK /

将上述代码修改为:

90 #define CONFIG_CONS_INDEX 1

91 #define CONFIG_SYS_NS16550_COM1 OMAP34XX_UART1

92 #define CONFIG_SERIAL1 1 / UART1 on AM3517 ICETEK /

重新编译u-boot,得到u-boot.bin,烧写至nandflash,重新启动,Xloader启动信息打印在UART3,u-boot启动信息打印在UART1。

1.2修改内核解压缩打印串口

内核解压缩信息打印使用的串口,在Linux内核源码程序中。进入linux源码文件根目录,找到 arch/arm/mach-omap2/include/mach/uncompress.h,打开之后发现里面只有一行:

include

include

找到arch/arm/plat-omap/include/mach/uncompress.h,打开后发现以下代码:

43 #ifdef CONFIG_OMAP_LL_DEBUG_UART3

44 uart = (volatile u8 *)(OMAP_UART3_BASE);

45 #elif defined(CONFIG_OMAP_LL_DEBUG_UART2)

46 uart = (volatile u8 *)(OMAP_UART2_BASE);

47 #elif defined(CONFIG_OMAP_LL_DEBUG_UART1)

48 uart = (volatile u8 *)(OMAP_UART1_BASE);

49 #elif defined(CONFIG_OMAP_LL_DEBUG_NONE)

50 return;

由以上可知内核解压缩信息打印所使用的串口配置以来Linux内核调试串口的配置,与内核调试串口相同。

1.3修改内核调试串口

内核调试串口的配置在Linux诶和配置中选择。在Linux源代码根目录下运行一下命令:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig

打开配置界面后,找到一下选项:

System Type --->

TI OMAP Implementations  --->

    Low-level debug console UART (UART3)  --->

修改为:

    Low-level debug console UART (UART1) --->

这里的 (UART1) 表示调试串口选择UART1。

保存后退出配置界面,运行以下命令重新编译内核:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage

将编译后的内核烧写至nandflash,设置u-boot启动参数从nandflash启动,启动内核。在UART1打印出内核解压以及内核启动信息如下:

NAND read: device 0 offset 0x280000, size 0x500000

5242880 bytes read: OK

Booting kernel from Legacy Image at 80000000 ...

Image Name: Linux-2.6.32

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 2313024 Bytes = 2.2 MB

Load Address: 80008000

Entry Point: 80008000

Verifying Checksum ... OK

Loading Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux................................................................................................................................................. done, booting the kernel.

Linux version 2.6.32 (root@world-desktop) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #1 Mon Apr 2 20:04:47 CST 2012

CPU: ARMv7 Processor [411fc087] revision 7 (ARMv7), cr=10c53c7f

CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache

Machine: OMAP3517/AM3517 EVM

......................................................

1.4修改文件系统中使用的显示终端串口

系统中使用的终端显示串口配置在/etc/inittab文件中。打开开发板根文件系统下的/etc/inittab文件,找到一下信息:

31 S:2345:respawn:/sbin/getty 115200 ttyS2

将其修改为:

31 S:2345:respawn:/sbin/getty 115200 ttyS0

完成全部修改任务。

2.感触

(1)Linux开源特性,使得我们可以很好地对其进行源码级的修改,使其适合于我们的设计要求。

(2)在进行系统设计时一定要先做好仔细前期准备。尤其在做硬件设计时,一定要充分考虑使用中要用到的资源,不然就会造成后期软件设计者更多的麻烦。

(3)在做系统设计时一定要充分利用现有资源,在现有基础上进行设计开发。

本文由朗锐智科编辑整理(www.lrist.com),如有侵权请联系本站。

相关文章
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
4951 77
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
541 32
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
1590 63
Linux调试
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10277 2
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
875 15
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
767 13
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
841 14
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
8067 6
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
894 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
网络协议 Ubuntu Linux
用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
1190 1