16C554在LINUX上的移植(AT91)

2021-08-15 17:57:37 字數 3246 閱讀 5317

16c554在linux上的移植(at91)

linux版本:2.6.30

at91sam9263

修改串列埠擴充套件驅動:

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

my psmu-c4m11 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,並不會

+#define at91_gpio_irq_hack

+

+#ifdef at91_gpio_irq_hack

+#include

+#endif 

+#ifdef at91_gpio_irq_hack

+#define nr_tries 10

+ int ntries = 0;

+ int pin_val1, pin_val2;

+ do while (pin_val1 != pin_val2 && ntries++ < nr_tries);

+

+ udelay(20); // ***: this need to be here otherwise ide layer losts interrups, don't know why !!!

+ if (pin_val1 == 0 || ntries > nr_tries)

+ return irq_handled;

+#undef nr_tires

+#endif

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驅動》

4,

/arch/arm/mach-at91/board-tms.c

該檔案中有新增16c550驅動定義

16C554在LINUX上的移植(AT91)

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

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