UART設備驅動探究1



UART設備驅動探究

1--Uart設備發送和接受數據的流程

1.1 tty設備發送數據的流程:

--tty核心從一個用戶獲取將要發送給一個tty設備的數據,[用戶空間-->tty核心(tty_write)];

--tty核心將數據傳遞給tty線路規程驅動,[tty核心--->tty線路規程驅動(ldisc.write)];

--接着數據被傳遞到tty驅動,tty驅動將數據轉換爲可以發送給硬件的格式。[線路規程-->tty驅動(dirver.write)];

1.2 tty設備接受數據的流程:

--tty設備將數據提交給tty驅動,[tty_flip_buffer_push--->ldisc.read];

--tty驅動將數據提交給tty線路規程驅動,[ldisc.read--->tty_read];

--tty線路規程驅動將數據提交給tty核心,然後tty核心再提交給用戶;[tty_read--->read];


2--uart驅動程序
2.1 特定UART相關的驅動程序結構
struct uart_driver {
 struct module *owner; /* Module that owns this struct */
 const char *driver_name; /* Name */
 const char *dev_name; /* /dev node name such as ttyS */
 /* ... */
 int major; /* Major number */
 int minor; /* Minor number */
 /* ... */
 struct tty_driver *tty_driver; /* tty driver */
};

2.2 UART驅動程序擁有的每個端口都存在uart_port結構的一個實例
struct uart_port {
 spinlock_t lock; /* port lock */
 unsigned int iobase; /* in/out[bwl]*/
 unsigned char __iomem *membase; /* read/write[bwl]*/
 unsigned int irq; /* irq number */
 unsigned int uartclk; /* base uart clock */
 unsigned char fifosize; /* tx fifo size */
 unsigned char x_char; /* xon/xoff flow
 /*...*/
}

2.3 struct uart_ops是每個UART驅動程序必須支持的物理硬件上可完成的操作的入口函數的集合

struct uart_ops {
 uint (*tx_empty)(struct uart_port *); /* Is TX FIFO empty? */
 void (*set_mctrl)(struct uart_port *,
 unsigned int mctrl); /* Set modem control params */
 uint (*get_mctrl)(struct uart_port *); /* Get modem control params */
 void (*stop_tx)(struct uart_port *); /* Stop xmission */
 void (*start_tx)(struct uart_port *); /* Start xmission */
 /* ... */
 void (*shutdown)(struct uart_port *); /* Disable the port */
 void (*set_termios)(struct uart_port *,
 struct termios *new,
 struct termios *old); /* Set terminal interface
 params */
 /* ... */
 void (*config_port)(struct uart_port *,
 int); /* Configure UART port */
 /* ... */
};
UART驅動程序爲了將自身和內核聯繫起來,必須完成兩個重要的步驟
(1)通過調用uart_register_dirver(struct uart_driver*);向串行核心註冊;
(2)通過調用uart_add_one_port(struct uart_dirver*, struct uart_port*)註冊其支持的每個端口。


2.串口發送數據
---------------------------------------------------
->write         (應用層)
---------------------------------------------------
-->sys_write
          (系統調用)
-->vfs_write   
---------------------------------------------------
---->tty_write(**tty_fops)
          (核心層)
---->do_tty_write(ld->ops->write, tty, file, buf, count);
---------------------------------------------------
------>n_tty_write(tty_ldisc_N_TTY)
          (線路規程)
-------->c = tty->ops->write(tty, b, nr);
---------------------------------------------------
---------->uart_write
----------->uart_start
          (tty統一驅動層)
------------>__uart_start
------------->port->ops->start_tx(port);
---------------------------------------------------
--------------->s3c24xx_serial_start_tx (tty設備)
在串口中斷處理程序中發送數據。
---------------------------------------------------

//參考書籍--精通LINUX設備驅動開發--宋寶華

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章