1. 程式人生 > >uboot.2015.07移植之驅動串列埠(4)

uboot.2015.07移植之驅動串列埠(4)

移植u-boot-2015.07之修改程式支援串列埠列印

1.修改start.S裡面的分頻係數

#define S3C2440_UPLL_48M    ((56 << 12) | (2 << 4) | (2 << 0))
#define S3C2440_MPLL_400M   ((0x5c << 12) | (1 << 4) | (1 << 0))
#define S3C2440_FHP_821     (0x05)

/* 初始化時鐘 */
    mrc P15, 0, R0, C1, C0, 0   /* Read C1 register to R0 */
orr R0, R0, #0xC0000000 /* Set iA=1,nF=1,mode---Asynchronous */ orr R0, R0, #(1 << 12) /* Enable icache */ mcr P15, 0, R0, C1, C0, 0 /* Write to C1 register */ ldr r0, =0x4c000014 /* 設定分頻係數,FCLK:HCLK:PCLK = 8:2:1 */ ldr r1, =S3C2440_FHP_821 /* 400M:100M:50M */ str r1
, [r0]

2.設定時鐘

//  ldr r0, =0x4c000000         /* Set lock time */
//  ldr r1, =0xFFFFFFFF         
//  str r1, [r0]

    ldr r0, =0x4c000004
    ldr r1, =S3C2440_MPLL_400M  /* 設定MPLL輸出時鐘400M */
    str r1, [r0]

/* 延時,程式設計手冊裡面有明確指出要進行一段時間的延時 */
1:
    ldr r0, =4000
    sub r0, r0, #1
    bne 1b

    ldr r0, =0x4c000008         /* UPLL 48M */
    ldr r1
, =S3C2440_UPLL_48M str r1, [r0] 1: ldr r0, =8000 sub r0, r0, #1 bne 1b

3.修改board_early_init_f函式

在 board.c 檔案裡面找到 board_early_init_f 函式,註釋掉MPLL的設定(切換到board.c裡面的函式的方法是修改smdk2440.h裡面,註釋掉#define CONFIG_SYS_GENERIC_BOARD。另外在make的時候會出現錯誤,修改u-boot.lds檔案,刪掉第一行的#define CONFIG_SYS_GENERIC_BOARD,重新make)

4.修改lowlevel_init裡面的SDRAM引數

SMRDATA:
        .long 0x22011110
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00018005
        .long 0x00018005
        .long 0x008C04F4
        .long 0x000000B1
        .long 0x00000030
        .long 0x00000030

5.編譯


  • 拷貝覆蓋檔案到虛擬機器裡面
  • make smdk2440_defconfig
  • make
make 結束後會出現一個警告
all:        $(ALL-y)
ifneq ($(CONFIG_SYS_GENERIC_BOARD),y)
    @echo "===================== WARNING ======================"
    @echo "Please convert this board to generic board."
    @echo "Otherwise it will be removed by the end of 2014."
    @echo "See doc/README.generic-board for further information"
    @echo "===================================================="
endif

這個警告說的是在2014版本的結束就會使用一個通用的板設定,這個與巨集定義 CONFIG_SYS_GENERIC_BOARD 有關,因為上面我們已經在S3C2440.h檔案裡面註釋掉了這個巨集定義,所以這裡就會出現警告,這個暫時不用去管它。
如果不註釋smdk2440.h裡面的#define CONFIG_SYS_GENERIC_BOARD,上述步驟執行完畢後直接make,不會出現錯誤以及警告,並且重啟開發板的時候直接就會執行到了命令列等待使用者輸入,而不是卡到flash的檢測上面,這點也是2015改進的一個地方吧

6.CONFIG_SYS_GENERIC_BOARD巨集定義作用

在2015版本中,這個巨集定義的使用使得 board.c 檔案不被編譯進 bootloader 裡面了,取而代之的是頂層目錄的 common 資料夾下面的 board_r.c 檔案。這個檔案裡面包含有以前在 board.c 檔案裡面的所有函式,並且對以前的函式進行了改進,確切來說是變得更加分散化了,也就更有利於擴充套件,但是在理解起來會比較有困難,不過從大體上來說這兩個檔案實現的功能都是類似的,完全可以按照同樣的思路去理解這兩個檔案。