基於設備總線驅動模型
在hi3531的linux內核中串口驅動和設備是掛在AMBA總線下的,其驅動程序文件爲drivers/serial/amba-pl011.c,在linux內核配置中默認是使能該驅動的,如果沒有則:make menuconfig -> Character devices ->Serial drives中使能,必須使能該驅動才能使用串口tty設備
上面介紹串口驅動的使能,下面添加amba總線上的串口設備
在linux-3.0.y\arch\arm\mach-godnet\core.c文件下
這兩個是添加uart0 1的amba總線設備數據結構體
HIL_AMBA_DEVICE(uart0, "uart:0", UART0, NULL);
HIL_AMBA_DEVICE(uart1, "uart:1", UART1, NULL);
HIL_AMBA_DEVICE(uart2, "uart:2", UART2, NULL);
HIL_AMBA_DEVICE(uart3,
"uart:3", UART3, NULL);
static void uart_clk_init(unsigned long busclk)
{
uart_clk.rate = busclk/2;
lookups[0].dev_id = "uart:0";
lookups[0].clk = &uart_clk;
lookups[1].dev_id = "uart:1";
lookups[1].clk = &uart_clk;
lookups[2].dev_id = "uart:2";
lookups[2].clk = &uart_clk;
lookups[3].dev_id = "uart:3";
lookups[3].clk = &uart_clk;
}
下面看下宏定義:
其實就是amba設備數據結構體賦值
#define HIL_AMBA_DEVICE(name, busid, base, platdata) \
static struct amba_device HIL_AMBADEV_NAME(name) = \
{.dev
= { \
.coherent_dma_mask = ~0, \
/*用來設置設備在總線上的名字*/
.init_name = busid, \
/*給平臺總線設備賦值私有數據*/
.platform_data = platdata, \
}, \
.res = { \
/*設備資源的寄存器基礎物理地址*/
.start = base##_BASE, \
/*設備資源的寄存器結束理地址*/
.end = base##_BASE + 0x10000 - 1, \
.flags = IORESOURCE_IO, \
}, \
.dma_mask = ~0, \
/*設備的中斷資源*/
.irq = { base##_IRQ, NO_IRQ } \
}
struct amba_device {
struct device
dev;
struct resourceres;
struct clk
*pclk;
struct regulator*vcore;
u64 dma_mask;
unsigned int
periphid;
unsigned int
irq[AMBA_NR_IRQS];
};
在上述宏定義中.irq = { base##_IRQ, NO_IRQ } \
其實就是 .irq={UART0_IRQ,NO_IRQ}
在linux-3.0.y\arch\arm\mach-godnet\include\mach\irqs.h中
#define UART0_IRQ(GODNET_IRQ_START + 9)
#define UART2_IRQ(GODNET_IRQ_START
+ 11)
要想添加新的串口在上述位置添加新的UART即可
串口驅動沒有在驅動中建立設備文件,因此在文件系統的啓動腳本手動建立
在/etc/init.d/S00devs
mknod /dev/ttyAMA3 c 204 66