新聞中心

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

        ARM-Linux s3c2440 之UART分析(三)

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

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

        本文引用地址:http://www.104case.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;

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

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

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


        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ū)動(dòng)注冊(cè)
        20. out:
        21. if(retval<0){
        22. put_tty_driver(normal);
        23. kfree(drv->state);
        24. }
        25. returnretval;
        26. }

        接著進(jìn)行總線驅(qū)動(dòng)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為_(kāi)_init段,模塊加載時(shí)初始化:


        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. }

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

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



        關(guān)鍵詞: ARMLinuxs3c2440UAR

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 玉屏| 东阳市| 叶城县| 阳泉市| 忻城县| 南澳县| 全州县| 盐城市| 苗栗市| 大姚县| 长宁区| 若尔盖县| 繁昌县| 黄龙县| 广平县| 德州市| 汉寿县| 府谷县| 甘孜县| 嘉峪关市| 长岭县| 巴楚县| 惠水县| 府谷县| 耒阳市| 沭阳县| 阿巴嘎旗| 浑源县| 卓尼县| 获嘉县| 苍南县| 和平区| 志丹县| 盖州市| 武定县| 延吉市| 宁蒗| 左权县| 商丘市| 三原县| 大悟县|