1. 程式人生 > >AM3359多路串列埠支援

AM3359多路串列埠支援

AM3359共支援6路串列埠,我目前測試了前5路都是通的,第6路留作它用了,沒有測試。配置只要涉及三個部分:

  1 引腳配置

  把對應引腳配成串列埠引腳。這裡要注意在你的檔案裡查詢,確認這個引腳沒有被配成其它功能,否則的話使用的是最後被配置的功能,導致串列埠不通。

  2 時鐘模組使能

  uart1-uart5使用的是L4HS提供的時鐘,所以確保CM_PER_L4HS_CLKCTRL,CM_PER_L4HS_CLKSTCTRL這兩個配置是使能的。這兩個模組的上電覆位值是使能了這個時鐘模組的,如果關閉了,賦予上電覆位預設值即可使能。然後分別初始化uart1-uart5這5個獨立的時鐘模組,如CM_PER_UART1_CLKCTRL,賦予2,使能時鐘模組。這5各模組預設時鐘是關閉的。

  3 串列埠控制暫存器的初始化

  我使用的是u-boot2011,如果是這個版本的,串列埠0是控制檯是通的,仿照  串列埠0

 #define CONFIG_SYS_NS16550_COM1  0x44e09000    /* UART0  */  

   新增 支援串列埠1

  #define CONFIG_SYS_NS16550_COM20x48022000    /* UART1  */

 其它路類似,結果是不行的。程式實際只初始化了一路串列埠。這個可以通過檢視串列埠0和其它路串列埠暫存器得到驗證。

如果要支援多路串列埠初始化,必須新增

#define CONFIG_SERIAL_MULTI	1

否則的話,只支援一路控制檯的串列埠初始化。

但是加上 CONFIG_SERIAL_MULTI支援多路串列埠後,我的uboot編譯不通過。提示arch/arm/cpu/armv7/omap-common下的spl.c中的serial_ini未定義。

這裡先不追究這個問題。實際上串列埠控制器的初始化,可以在uboot裡直接用命令列,把ns16550.c的NS16550_init()函式寫成命令列,baud_divisor是16,因為初始化的控制器的時候我們會選擇串列埠16x模式。

初始化之後向傳送暫存器寫個資料,可以用示波器從傳送引腳測到。

  vxWorks串列埠支援

  vxWokrs裡仿照串列埠0,新增對多路串列埠的支援。編譯之後,執行,devs可以檢視有對應的裝置檔案。但是仍然是不通的。vxWorks6.7裡串列埠檔案使用的是target/src/hwif/sio/vxbNs16550sio.c,這個檔案的初始化函式較uboot的ns16550.c對MDR1暫存器的初始化。MDR1暫存器有個配置選項是設定介面為UART 16XMode。老的ns16550檔案預設介面就是串列埠,不需要設定這個暫存器。而AM3359的串列埠模組是支援多模式的,也就是說這個模組即可以配置成串列埠也可以配成其它功能的介面,如SIRmode,FIR mode等。而上電覆位之後的預設狀態是disable這個模組的。所以如果使用的是老的ns16550檔案,只需在初始化裝置檔案裡給這個暫存器賦初值0即可。修改之後在target/src/hwif目錄下 make CPU=ARMARCH6 TOOL=GNU重新編譯vxbNs16550sio.c產生新的vxbNs16550sio.o庫檔案供vxWorks核心編譯時呼叫即可。