国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        技術文章:基于Linux的tty架構及UART驅動詳解

        2021-02-05 17:06
        一口Linux
        關注

        2.2.3. struct uart_state

        每一個uart端口對應著一個uart_state,該結構體將uart_port與對應的circ_buf聯系起來。uart_state有兩個成員在底層串口驅動會用到:xmit和port。

        用戶空間程序通過串口發送數據時,上層驅動將用戶數據保存在xmit;而串口發送中斷處理函數就是通過xmit獲取到用戶數據并將它們發送出去。串口接收中斷處理函數需要通過port將接收到的數據傳遞給線路規程層。

        struct uart_state {
              struct  tty_port  port;
             
              enum uart_pm_state   pm_state;
              struct circ_buf     xmit;
             
              struct uart_port     *uart_port; 對應于一個串口設備
        };
        2.2.4. struct uart_port

        uart_port用于描述串口端口的I/O端口或I/O內存地址、FIFO大小、端口類型、串口時鐘等信息。實際上,一個uart_port實現對應一個串口設備。

        struct uart_port {
               spinlock_t              lock;                    port lock
               unsigned long           iobase;                  in/out[bwl]
               unsigned char __iomem   *membase;                read/write[bwl]
               unsigned int            (*serial_in)(struct uart_port *, int);
               void                    (*serial_out)(struct uart_port *, int, int);
               void                    (*set_termios)(struct uart_port *,
                                                      struct ktermios *new,
                                                      struct ktermios *old);
               int                     (*handle_irq)(struct uart_port *);
               void                    (*pm)(struct uart_port *, unsigned int state,
                                             unsigned int old);
               void                    (*handle_break)(struct uart_port *);
               unsigned int            irq;                     irq number
               unsigned long           irqflags;                irq flags  
               unsigned int            uartclk;                 base uart clock
               unsigned int            fifosize;                tx fifo size
               unsigned char           x_char;                  xon/xoff char
               unsigned char           regshift;                reg offset shift
               unsigned char           iotype;                  io access style
               unsigned char           unused1;
        #define UPIO_PORT               (0)
        #define UPIO_HUB6               (1)
        #define UPIO_MEM                (2)
        #define UPIO_MEM32              (3)
        #define UPIO_AU                 (4)                      Au1x00 and RT288x type IO
        #define UPIO_TSI                (5)                      Tsi108/109 type IO
               unsigned int            read_status_mask;        driver specific
               unsigned int            ignore_status_mask;      driver specific
               struct uart_state       *state;                  pointer to parent state
               struct uart_icount      icount;                  statistics
               struct console          *cons;                   struct console, if any
        #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)
               unsigned long           sysrq;                   sysrq timeout
        #endif
               upf_t                   flags;
        #define UPF_FOURPORT            ((__force upf_t) (1 << 1))
        #define UPF_SAK                 ((__force upf_t) (1 << 2))
        #define UPF_SPD_MASK            ((__force upf_t) (0x1030))
        #define UPF_SPD_HI              ((__force upf_t) (0x0010))
        #define UPF_SPD_VHI             ((__force upf_t) (0x0020))
        #define UPF_SPD_CUST            ((__force upf_t) (0x0030))
        #define UPF_SPD_SHI             ((__force upf_t) (0x1000))
        #define UPF_SPD_WARP            ((__force upf_t) (0x1010))
        #define UPF_SKIP_TEST           ((__force upf_t) (1 << 6))
        #define UPF_AUTO_IRQ            ((__force upf_t) (1 << 7))
        #define UPF_HARDPPS_CD          ((__force upf_t) (1 << 11))
        #define UPF_LOW_LATENCY         ((__force upf_t) (1 << 13))
        #define UPF_BUGGY_UART          ((__force upf_t) (1 << 14))
        #define UPF_NO_TXEN_TEST        ((__force upf_t) (1 << 15))
        #define UPF_MAGIC_MULTIPLIER    ((__force upf_t) (1 << 16))
        Port has hardware-assisted h/w flow control (iow, auto-RTS *not* auto-CTS)
        #define UPF_HARD_FLOW           ((__force upf_t) (1 << 21))
        Port has hardware-assisted s/w flow control
        #define UPF_SOFT_FLOW           ((__force upf_t) (1 << 22))
        #define UPF_CONS_FLOW           ((__force upf_t) (1 << 23))
        #define UPF_SHARE_IRQ           ((__force upf_t) (1 << 24))
        #define UPF_EXAR_EFR            ((__force upf_t) (1 << 25))
        #define UPF_BUG_THRE            ((__force upf_t) (1 << 26))
        The exact UART type is known and should not be probed.  
        #define UPF_FIXED_TYPE          ((__force upf_t) (1 << 27))
        #define UPF_BOOT_AUTOCONF       ((__force upf_t) (1 << 28))
        #define UPF_FIXED_PORT          ((__force upf_t) (1 << 29))
        #define UPF_DEAD                ((__force upf_t) (1 << 30))
        #define UPF_IOREMAP             ((__force upf_t) (1 << 31))
        #define UPF_CHANGE_MASK         ((__force upf_t) (0x17fff))
        #define UPF_USR_MASK            ((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY))
               unsigned int            mctrl;                   current modem ctrl settings
               unsigned int            timeout;                 character-based timeout
               unsigned int            type;                    port type
               const struct uart_ops   *ops;
               unsigned int            custom_divisor;
               unsigned int            line;                    port index
               resource_size_t         mapbase;                 for ioremap
               struct device           *dev;                    parent device
               unsigned char           hub6;                    this should be in the 8250 driver
               unsigned char           suspended;
               unsigned char           irq_wake;
               unsigned char           unused[2];
               void                    *private_data;           generic platform data pointer
        };
        2.2.5. struct uart_ops

        struct uart_ops涵蓋了驅動可對串口的所有操作

        struct uart_ops {
               unsigned int    (*tx_empty)(struct uart_port *);
               void            (*set_mctrl)(struct uart_port *, unsigned int mctrl);
               unsigned int    (*get_mctrl)(struct uart_port *);
               void            (*stop_tx)(struct uart_port *);
               void            (*start_tx)(struct uart_port *);
               void            (*throttle)(struct uart_port *);
               void            (*unthrottle)(struct uart_port *);
               void            (*send_xchar)(struct uart_port *, char ch);
               void            (*stop_rx)(struct uart_port *);
               void            (*enable_ms)(struct uart_port *);
               void            (*break_ctl)(struct uart_port *, int ctl);
               int             (*startup)(struct uart_port *);
               void            (*shutdown)(struct uart_port *);
               void            (*flush_buffer)(struct uart_port *);
               void            (*set_termios)(struct uart_port *, struct ktermios *new,
                                              struct ktermios *old);
               void            (*set_ldisc)(struct uart_port *, int new);
               void            (*pm)(struct uart_port *, unsigned int state,
                                     unsigned int oldstate);
               int             (*set_wake)(struct uart_port *, unsigned int state);
               
                * Return a string describing the type of the port
               
               const char      *(*type)(struct uart_port *);
               
                * Release IO and memory resources used by the port.
                * This includes iounmap if necessary.
               
               void            (*release_port)(struct uart_port *);
               
                * Request IO and memory resources used by the port.
                * This includes iomapping the port if necessary.
               
               int             (*request_port)(struct uart_port *);
               void            (*config_port)(struct uart_port *, int);
               int             (*verify_port)(struct uart_port *, struct serial_struct *);
               int             (*ioctl)(struct uart_port *, unsigned int, unsigned long);
        #ifdef CONFIG_CONSOLE_POLL
               int             (*poll_init)(struct uart_port *);
               void            (*poll_put_char)(struct uart_port *, unsigned char);
               int             (*poll_get_char)(struct uart_port *);
        #endif
        };

        2.3. 關鍵流程2.3.1. 注冊流程2.3.1.1. 注冊uart_driver

        此接口在uart driver中調用,用來注冊uart_driver到kernel中,調用階段在uart driver的初始階段,例如:module_init(), uart_driver的注冊流程圖

        圖3.3uart driver注冊流程

        注冊過程主要做了以下操作:

        1、根據driver支持的最大設備數,申請n個uart_state空間,每一個uart_state都有一個uart_port。2、分配一個tty_driver,并將uart_driver->tty_driver指向它。3、對tty_driver進行設置,其中包括默認波特率、檢驗方式等,還有一個重要的ops,結構體tty_operation的注冊,它是tty核心與串口驅動通信的接口。4、初始化每一個uart_state的tty_port;5、注冊tty_driver。注冊uart_driver實際上是注冊tty_driver,與用戶空間打交道的工作完全交給tty_driver,這一部分是內核實現好的不需要修改2.3.1.2. 添加uart_port

        此接口用于注冊一個uart port 到uart driver上,通過注冊,uart driver就可以訪問對應的uart port,進行數據收發。該接口在uart driver中的probe函數調用,必須保證晚于uart_register_drver的注冊過程。

        <上一頁  1  2  3  4  下一頁>  
        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          人工智能 獵頭職位 更多
          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 国产???做受视频| 亚洲成人色情| 丰满人妻一区二区三区在线视频53| 两个人的免费视频| 无码人妻一区二区三区线花季软件| 撸啊撸激情久久| 熟女国产精品网站| 克什克腾旗| A片网| 无码av在线播放| 明光市| 9久精品视频| 亚洲尤物你懂的视频在线看| 99白浆| jizz国产| 凌云县| 97香蕉碰碰人妻国产欧美| 欧美午夜成人电影| 露脸丨91丨九色露脸| 天天综合91| 沛县| 成人无码AV片| 国产熟女a?v| 影音先锋成人在线| 奇骏影院在线观看免费版| 夜夜国自一区+1080P| 屏山县| 婷婷综合色| 午夜剧场黄色| 国产乱码一区二区三区的解决方法| 岛国在线无码| 人人操网| 少妇综合网| 裕民县| 尤物福利导航| AV黄色| 中文字幕亚洲天堂| 周至县| 色性av| 国产亚洲合集| 国产精品18久久久久久麻辣|