1. 程式人生 > >嵌入式 修改u-boot與Linux除錯串列埠以及檔案系統顯示終端串列埠

嵌入式 修改u-boot與Linux除錯串列埠以及檔案系統顯示終端串列埠

1.背景

        近期一個專案,使用TI Cortex-A8的晶片AM3517作為主控開發。前期使用北京瑞泰公司的ICETEK-AM3517-KB核心板搭建開發環境。在自己做底板布板的時候的時候塗個佈線方便,改用UART1作為除錯串列埠,而原來瑞泰給的開發包,已經TI的AM3517 PSP均以UART3作為除錯串列埠。於是在底板焊接完成除錯的時候就有了一天痛苦的經歷和這篇文章。

       在原版的PSP中, 一共有五處使用到UART3作為列印和除錯串列埠:

       (1)Xloader的列印串列埠

       (2)u-boot的列印串列埠

       (3)核心解壓時的資訊列印串列埠

        (4)核心除錯串列埠

        (5)檔案系統中使用的顯示終端串列埠

       以上第一處Xloader的列印資訊量少且系統中不需要使用,不做修改。本文中講述後四種情況的修改。

2.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。

2.2修改核心解壓縮列印串列埠

        核心解壓縮資訊列印使用的串列埠,在linux核心原始碼程式中。進入linux原始碼檔案根目錄,找到 arch/arm/mach-omap2/include/mach/uncompress.h,開啟之後發現裡面只有一行:
#include <plat/uncompress.h>
#include <plat/uncompress.h>

找到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核心除錯串列埠的配置,與核心除錯串列埠相同。

2.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 ([email protected]) (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

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

2.4修改檔案系統中使用的顯示終端串列埠

        系統中使用的終端顯示串列埠配置在/etc/inittab檔案中。開啟開發板根檔案系統下的/etc/inittab檔案,找到一下資訊:

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

將其修改為:

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

完成全部修改任務。

3.感觸

       (1)Linux開源特性,使得我們可以很好地對其進行原始碼級的修改,使其適合於我們的設計要求。

        (2)在進行系統設計時一定要先做好仔細前期準備。尤其在做硬體設計時,一定要充分考慮使用中要用到的資源,不然就會造成後期軟體設計者更多的麻煩。

        (3)在做系統設計時一定要充分利用現有資源,在現有基礎上進行設計開發。