16C554在LINUX上的移植(AT91)

2021-09-07 02:26:27 字數 3642 閱讀 2151

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