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