在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

            ARM-Linux s3c2440 之UART分析(三)

            作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
            回顧一下上文,s3c2440串口底層驅(qū)動圍繞三個數(shù)據(jù)結(jié)構(gòu)展開:

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

            本文引用地址:http://www.biyoush.com/article/201611/318133.htm

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

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

            實現(xiàn)了這三個數(shù)據(jù)結(jié)構(gòu)體,基本完成了驅(qū)動操作函數(shù)的實現(xiàn),緊接著需要對串口設(shè)備及設(shè)備驅(qū)動進行初始化,首先是模塊初始化module_init(s3c24xx_serial_modinit):

            1. staticint__inits3c24xx_serial_modinit(void)
            2. {
            3. intret;
            4. ret=uart_register_driver(&s3c24xx_uart_drv);//注冊uart驅(qū)動,在serial_core.c中實現(xiàn)
            5. if(ret<0){
            6. printk(KERN_ERR"failedtoregisterUARTdrivern");
            7. return-1;
            8. }
            9. return0;
            10. }

            uart_register_driver在串口核心及TTY層間進行相關(guān)注冊:


            1. intuart_register_driver(structuart_driver*drv)
            2. {
            3. structtty_driver*normal=NULL;
            4. drv->tty_driver=normal;
            5. normal->owner=drv->owner;
            6. normal->driver_name=drv->driver_name;
            7. normal->name=drv->dev_name;
            8. normal->major=drv->major;
            9. normal->minor_start=drv->minor;
            10. normal->type=TTY_DRIVER_TYPE_SERIAL;
            11. normal->subtype=SERIAL_TYPE_NORMAL;
            12. normal->init_termios=tty_std_termios;
            13. normal->init_termios.c_cflag=B9600|CS8|CREAD|HUPCL|CLOCAL;
            14. normal->init_termios.c_ispeed=normal->init_termios.c_ospeed=9600;
            15. normal->flags=TTY_DRIVER_REAL_RAW|TTY_DRIVER_DYNAMIC_DEV;
            16. normal->driver_state=drv;
            17. tty_set_operations(normal,&uart_ops);
            18. ….
            19. retval=tty_register_driver(normal);//tty驅(qū)動注冊
            20. out:
            21. if(retval<0){
            22. put_tty_driver(normal);
            23. kfree(drv->state);
            24. }
            25. returnretval;
            26. }

            接著進行總線驅(qū)動platform_driver_register:


            1. ints3c24xx_serial_init(structplatform_driver*drv,
            2. structs3c24xx_uart_info*info)
            3. {
            4. #ifdefCONFIG_PM
            5. drv->suspend=s3c24xx_serial_suspend;
            6. drv->resume=s3c24xx_serial_resume;
            7. #endif
            8. returnplatform_driver_register(drv);//
            9. }

            其中s3c24xx_serial_init為__init段,模塊加載時初始化:


            1. staticint__inits3c2440_serial_init(void)
            2. {
            3. returns3c24xx_serial_init(&s3c2440_serial_drv,&s3c2440_uart_inf);//
            4. }

            platfrom_driver_register()中調(diào)用driver_register()


            1. intplatform_driver_register(structplatform_driver*drv)
            2. {
            3. drv->driver.bus=&platform_bus_type;//
            4. if(drv->probe)
            5. drv->driver.probe=platform_drv_probe;
            6. if(drv->remove)
            7. drv->driver.remove=platform_drv_remove;
            8. if(drv->shutdown)
            9. drv->driver.shutdown=platform_drv_shutdown;
            10. if(drv->suspend)
            11. drv->driver.suspend=platform_drv_suspend;
            12. if(drv->resume)
            13. drv->driver.resume=platform_drv_resume;
            14. returndriver_register(&drv->driver);//
            15. }

            因為串口設(shè)備在系統(tǒng)是一種platform_device所以是一種總線驅(qū)動類型,總線設(shè)備驅(qū)動注冊platform_driver_register()之后,串口設(shè)備即可和相應(yīng)的驅(qū)動關(guān)聯(lián)起來了,這樣就完成了串口設(shè)備與串口驅(qū)動的注冊過程。

            下一篇講進一步結(jié)合源碼分析。



            關(guān)鍵詞: ARMLinuxs3c2440UAR

            評論


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

            關(guān)閉