16c554在linux上的移植(at91)
linux版本:3.14.17
at91sama5d36
einta_0 arm-io5 pa14 14
einta_1 arm-io7 pa2 2
einta_2 arm-io9 pa8 8
einta_3 arm-io11 pa3 3
eintb_0 arm-io6 pa4 4
eintb_1 arm-io8 pa0 0
eintb_2 arm-io10 pa1 1
eintb_3 arm-io12 pa9 9
eintc_0 arm-mcio_da0 pd1 97
eintc_1 arm-mcio_da2 pd3 99
eintc_2 arm-mcio_da4 pd5 101
eintc_3 arm-mcio_da6 pd7 103
eintd_0 arm-mcio_da1 pd2 98
eintd_1 arm-mcio_da3 pd4 100
eintd_2 arm-mcio_da5 pd6 102
eintd_3 arm-mcio_da7 pd8 104
修改串列埠擴充套件驅動:
1,在/drivers/serial/下以8250_exar_st16c554.c檔案為模板建立8250_at91_xr16v554.c檔案;修改相應的port和中斷號,修改platform device id為
plat8250_dev_at91_xr16v554;在init函式中加入了對匯流排,及中斷口的初始化操作;;在檔案/include/linux/serial_8250.h id列表中加入該id;
/drivers/serial/kconfig加入:
config serial_8250_at91_xr16v554
tristate "support exar xr16v554/554d quad uart for at91"
depends on serial_8250 != n
help
rp2805 uses xr16v554d to form quad uart. if you are
using these uarts,
say y here.
to compile this driver as a module, choose m here: the module
will be called 8250_at91_xr16v554.
/drivers/serial/makefile加入:
obj-$(config_serial_8250_at91_xr16v554) += 8250_at91_xr16v554.o
2,8250.c無須修改!!
需要注意的地方:
1,#define port(_base,_irq) \
巨集中,.mapbase指的是16c554的物理基位址,注意不是membase;.uartclk是16c554晶振的頻率,其最高波特率 為.uartclk/16;.iotype指的是訪問型別,與硬體的連線相關,upio_mem指的是8位匯流排連線,而upio_mem32表示為32位 匯流排訪問方式,即訪問16c554的暫存器時,讀取32位數,取低8位;.regshift也跟硬體的物理連線相關,指的是訪問16c554的每個位址時 的偏移,也就是16c554的a0對應cpu的a幾;upf_ioremap指16c554暫存器需要對映到虛擬位址訪問;
2,.dev = ,
裝置結構宣告中的***_data因為是個多維陣列,從而.platform_data = ***_data與.platform_data = &***_data意義是一樣的,都可以;
3,platform_device無須在板極初始化中註冊,使用module_init宣告即可;
鏈結的次序,對應執行的次序,與makefile中的次序一致;而註冊platform_device與註冊platform_driver的次序無關, 註冊成功時都會匹配,匹配成功,都會呼叫probe函式,probe裝置,只有probe成功才會進行位址對映,分配資源等等的操作;
4,在serial8250_init(void)函式中總會註冊一id為plat8250_dev_legacy的platform_device,而該裝置的資源在old_serial_port中定義,
而該陣列依賴於serial_port_dfns的定義,如果定義為空則,該device不會新增port;而其他device呼叫platform_device_register()函式時,如果匹配
驅動,會呼叫serial8250_probe(),該函式會從該裝置的資源中讀出資料,檢測每個port,如果存在則申請中斷號,對映實體地址等等,並新增port。
從而新增新的裝置無須修改8250.c,初始化時預設新增的裝置只要不定義serial_port_dfns,並不會有影響。
5,如果使用了gpio中斷,則需要注意at91的普通io口不能設定為上公升沿或下降沿觸發,而只能定義為邊沿觸發,即每次有效電平觸發2次,只是浪費了cpu,並不會
影響使用;
6,如果開機檢測成功,新增埠成功,會列印:
serial8250.11: ttys0 at mmio 0x30000000 (irq = 83) is a 16550a
serial8250.11: ttys1 at mmio 0x30000008 (irq = 84) is a 16550a
serial8250.11: ttys2 at mmio 0x30000010 (irq = 85) is a 16550a
serial8250.11: ttys3 at mmio 0x30000018 (irq = 86) is a 16550a
幾個有用的命令:
檢視各個串列埠的資源,如果不正常肯定初始化有問題
cat /proc/tty/driver/serial
從串列埠讀出資料(波特率是上次設定的)
cat /dev/ttys0
檢視iomem
cat /proc/iomem
參考:1,《linux裝置模型之uart驅動分析》
2,《我在linux-2.6.32.2下為st16c554移植驅動的經歷》
3,《linux2.6.14核心下移植16c554驅動》
16C554在LINUX上的移植(AT91)
16c554在linux上的移植 at91 linux版本 2.6.30 at91sam9263 修改串列埠擴充套件驅動 1,在 drivers serial 下以8250 exar st16c554.c檔案為模板建立8250 at91 xr16v554.c檔案 修改相應的port和中斷號,修改pl...
Linux 2 6 26 在S3C2440上的移植
我使用的板子與s3c2440的公板差不多,linux2.6.26對smdk的板支援得比較好,改動不多,這裡只對過程做乙個簡單的記錄。開發環境 vmware ubuntu 8.10,虛擬機器配置了兩個網絡卡,乙個是bridge連線,用來在虛擬機器中訪問網際網路 乙個是nat連線用來搭samba伺服器與...
在Linux上執行C
眾所周知,c 是microsoft推出的.net語言,只能在.net平台上執行,例如win 9x me nt 2000 xp和win ce之類的作業系統。但是,現在卻有了乙個叫做mono的專案,它的目標就是把.net及其程式語言移植到非windows的平台上。現在,c 是唯一被移植到非windows...