新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM-Linux s3c2440 之UART分析(二)

        ARM-Linux s3c2440 之UART分析(二)

        作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
        本文系itspy原創(chuàng),復(fù)制/轉(zhuǎn)載請盡量標明原出處http://blog.csdn.net/yyplc/article/details/7196290,謝謝!

        軟件篇(linux-2.6.30.4):

        本文引用地址:http://www.104case.com/article/201611/318132.htm

        Linux系統(tǒng)的串口驅(qū)動與一般字符設(shè)備并一樣,它采用層次化的架構(gòu),從而看做是一個串行系統(tǒng)來實現(xiàn)。

        (1)關(guān)注UART或其他底層串行硬件特征的底層驅(qū)動程序。

        (2)和底層驅(qū)動程序接口的TTY驅(qū)動程序。

        (3)加工用于和TTY驅(qū)動程序交換數(shù)據(jù)的線路規(guī)程。

        下圖描述了串行系統(tǒng)間的層次結(jié)構(gòu)關(guān)系(s3c2440串口實現(xiàn)例),可以概括為:用戶應(yīng)用層 --> 線路規(guī)劃層 -->TTY層 -->底層驅(qū)動層 -->物理硬件層

        線路規(guī)程和TTY驅(qū)動程序是與硬件平臺無關(guān)的,Linux源碼中已經(jīng)提供了實現(xiàn),所以對于具體的平臺,我們只需實現(xiàn)底層驅(qū)動程序即可,這也是我們最關(guān)心的。在s3c2440a中,主要由dirivers/serial/下的s3c2440.c和samsung.c實現(xiàn)。

        Uart驅(qū)動程序主要圍繞三個關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)展開(include/linux/serial_core.h中定義):

        UART特定的驅(qū)動程序結(jié)構(gòu)定義:struct uart_driver s3c24xx_uart_drv;

        UART端口結(jié)構(gòu)定義: struct uart_port s3c24xx_serial_ops;

        UART相關(guān)操作函數(shù)結(jié)構(gòu)定義: struct uart_ops s3c24xx_serial_ops;

        基于以上三個結(jié)構(gòu)體,來看看s3c2440是如何掛接到Linux中串口構(gòu)架的:

        S3c2440串口相關(guān)操作函數(shù)定義在s3c24xx_serial_ops中,這個是一個structuart_ops結(jié)構(gòu)


        1. staticstructuart_opss3c24xx_serial_ops={
        2. .pm=s3c24xx_serial_pm,//電源管理函數(shù)
        3. .tx_empty=s3c24xx_serial_tx_empty,//檢車發(fā)送FIFO緩沖區(qū)是否空
        4. .get_mctrl=s3c24xx_serial_get_mctrl,//是否串口流控
        5. .set_mctrl=s3c24xx_serial_set_mctrl,//是否設(shè)置串口流控cts
        6. .stop_tx=s3c24xx_serial_stop_tx,//停止發(fā)送
        7. .start_tx=s3c24xx_serial_start_tx,//啟動發(fā)送
        8. .stop_rx=s3c24xx_serial_stop_rx,//停止接收
        9. .enable_ms=s3c24xx_serial_enable_ms,//空函數(shù)
        10. .break_ctl=s3c24xx_serial_break_ctl,//發(fā)送break信號
        11. .startup=s3c24xx_serial_startup,//串口發(fā)送/接收,以及中斷申請初始配置函數(shù)
        12. .shutdown=s3c24xx_serial_shutdown,//關(guān)閉串口
        13. .set_termios=s3c24xx_serial_set_termios,//串口clk,波特率,數(shù)據(jù)位等參數(shù)設(shè)置
        14. .type=s3c24xx_serial_type,//CPU類型關(guān)于串口
        15. .release_port=s3c24xx_serial_release_port,//釋放串口
        16. .request_port=s3c24xx_serial_request_port,//申請串口
        17. .config_port=s3c24xx_serial_config_port,//串口的一些配置信息info
        18. .verify_port=s3c24xx_serial_verify_port,//串口檢測
        19. };

        驅(qū)動程序結(jié)構(gòu)定義:


        1. staticstructuart_drivers3c24xx_uart_drv={
        2. .owner=THIS_MODULE,
        3. .dev_name="s3c2440_serial",//具體設(shè)備名稱
        4. .nr=CONFIG_SERIAL_SAMSUNG_UARTS,//定義有幾個端口
        5. .cons=S3C24XX_SERIAL_CONSOLE,//console接口
        6. .driver_name=S3C24XX_SERIAL_NAME,//串口名:ttySAC
        7. .major=S3C24XX_SERIAL_MAJOR,//主設(shè)備號
        8. .minor=S3C24XX_SERIAL_MINOR,//次設(shè)備號
        9. };

        端口配置結(jié)構(gòu)定義,其中包括了一個structuart_ports結(jié)構(gòu):

        1. structs3c24xx_uart_port{
        2. unsignedcharrx_claimed;
        3. unsignedchartx_claimed;
        4. unsignedintpm_level;
        5. unsignedlongbaudclk_rate;
        6. unsignedintrx_irq;
        7. unsignedinttx_irq;
        8. structs3c24xx_uart_info*info;
        9. structs3c24xx_uart_clksrc*clksrc;
        10. structclk*clk;
        11. structclk*baudclk;
        12. structuart_portport;
        13. #ifdefCONFIG_CPU_FREQ
        14. structnotifier_blockfreq_transition;
        15. #endif
        16. };
        17. staticstructs3c24xx_uart_ports3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS]={
        18. [0]={//串口0
        19. .port={
        20. .lock=__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[0].port.lock),
        21. .iotype=UPIO_MEM,//
        22. .irq=IRQ_S3CUART_RX0,//中斷號
        23. .uartclk=0,//時鐘值
        24. .fifosize=16,//定義FIFO緩存區(qū)大小
        25. .ops=&s3c24xx_serial_ops,//串口相關(guān)操作函數(shù)
        26. .flags=UPF_BOOT_AUTOCONF,
        27. .line=0,//線路1
        28. }
        29. },
        30. [1]={//串口1
        31. .port={
        32. .lock=__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[1].port.lock),
        33. .iotype=UPIO_MEM,
        34. .irq=IRQ_S3CUART_RX1,
        35. .uartclk=0,
        36. .fifosize=16,
        37. .ops=&s3c24xx_serial_ops,
        38. .flags=UPF_BOOT_AUTOCONF,
        39. .line=1,
        40. }
        41. },
        42. #ifCONFIG_SERIAL_SAMSUNG_UARTS>2
        43. [2]={//串口2
        44. .port={
        45. .lock=__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[2].port.lock),
        46. .iotype=UPIO_MEM,
        47. .irq=IRQ_S3CUART_RX2,
        48. .uartclk=0,
        49. .fifosize=16,
        50. .ops=&s3c24xx_serial_ops,
        51. .flags=UPF_BOOT_AUTOCONF,
        52. .line=2,
        53. }
        54. },
        55. #endif
        56. };

        綜上所述,s3c2440主要是實現(xiàn)這三個數(shù)據(jù)結(jié)構(gòu):

        s3c24xx_serial_ops, s3c24xx_uart_drv, s3c24xx_uart_ports3c24xx_serial_ports

        下篇將進一步結(jié)合源碼探討ARM-Linuxs3c2440 的實現(xiàn)。



        關(guān)鍵詞: ARMLinuxs3c2440UAR

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 崇仁县| 余庆县| 周至县| 盘山县| 新河县| 独山县| 六安市| 台中市| 荔浦县| 盐津县| 青海省| 东山县| 德保县| 开阳县| 武定县| 梓潼县| 会东县| 洞口县| 西峡县| 铁岭县| 河北省| 精河县| 屏东市| 巩留县| 江都市| 上犹县| 花莲市| 江川县| 富锦市| 延安市| 青田县| 尼玛县| 龙游县| 双流县| 鄂温| 北票市| 沂南县| 凤山县| 晋中市| 甘南县| 新津县|