UART子系统(十六)编写虚拟UART驱动程序_调试

编写虚拟UART驱动程序_调试

  • 参考代码

    硬件相关:
    drivers/tty/serial/imx.c
    drivers/tty/serial/stm32-usart.c
    
    串口核心层:
    drivers/tty/serial/serial_core.c
    
    TTY层:
    drivers/tty/tty_io.c
    
  • 本节课程源码在GIT仓库里

    doc_and_source_for_drivers\IMX6ULL\source\09_UART
    	07_virtual_uart_driver_ok
    doc_and_source_for_drivers\STM32MP157\source\A7\09_UART
    	07_virtual_uart_driver_ok
    

1. 实验流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uUImMw84-1652622270158)(pic/09_UART/41_data_flow.png)]

2. 上机实验

2.1 设置工具链
1. STM32MP157
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
2. IMX6ULL
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
2.2 编译、替换设备树
1. STM32MP157
  • 修改arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dts,添加如下代码:

    / {
    	virtual_uart: virtual_uart_100ask {
    		compatible = "100ask,virtual_uart";
    		
    		interrupt-parent = <&intc>;
    		interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
    		
    	};
    };
    
  • 编译设备树:
    在Ubuntu的STM32MP157内核目录下执行如下命令,
    得到设备树文件:arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v2.dtb

    make dtbs
    
  • 复制到NFS目录:

    $ cp arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v2.dtb ~/nfs_rootfs/
    
  • 开发板上挂载NFS文件系统

    • vmware使用NAT(假设windowsIP为192.168.2.100)

      [root@100ask:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 
      192.168.2.100:/home/book/nfs_rootfs /mnt
      
    • vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.2.137

      [root@100ask:~]#  mount -t nfs -o nolock,vers=3 192.168.2.137:/home/book/nfs_rootfs /mnt
      
  • 更新设备树

    [root@100ask:~]# mount  /dev/mmcblk2p2  /boot
    [root@100ask:~]# cp /mnt/stm32mp157c-100ask-512d-lcd-v1.dtb /boot
    [root@100ask:~]# sync
    
  • 重启开发板

2. IMX6ULL
  • 修改arch/arm/boot/dts/100ask_imx6ull-14x14.dts,添加如下代码:

    / {
    	virtual_uart: virtual_uart_100ask {
    		compatible = "100ask,virtual_uart";
    		
    		interrupt-parent = <&intc>;
    		interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
    		
    	};
    
    };
    
  • 编译设备树:
    在Ubuntu的IMX6ULL内核目录下执行如下命令,
    得到设备树文件:arch/arm/boot/dts/100ask_imx6ull-14x14.dtb

    make dtbs
    
  • 复制到NFS目录:

    $ cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/
    
  • 开发板上挂载NFS文件系统

    • vmware使用NAT(假设windowsIP为192.168.2.100)

      [root@100ask:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 
      192.168.2.100:/home/book/nfs_rootfs /mnt
      
    • vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.2.137

      [root@100ask:~]#  mount -t nfs -o nolock,vers=3 192.168.2.137:/home/book/nfs_rootfs /mnt
      
    • 更新设备树

      [root@100ask:~]# cp /mnt/100ask_imx6ull-14x14.dtb /boot
      [root@100ask:~]# sync
      
  • 重启开发板

2.3 编译、安装驱动程序
  • 编译:

    • 在Ubuntu上
    • 修改07_virtual_uart_driver_ok中的Makefile,指定内核路径KERN_DIR,在执行make命令即可。
  • 安装:

    • 在开发板上

    • 挂载NFS,复制文件,insmod,类似如下命令:

      mount -t nfs -o nolock,vers=3 192.168.2.137:/home/book/nfs_rootfs /mnt
      // 对于IMX6ULL,想看到驱动打印信息,需要先执行
      echo "7 4 1 7" > /proc/sys/kernel/printk
      
      insmod -f /mnt/virtual_uart.ko
      
      
  • 观察内核打印的信息

3. 调试

根据框架、数据流程来调试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcpzz8Pd-1652622270160)(pic/09_UART/24_tty_driver_level_2.png)]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UART是通用异步收发器的缩写,它提供了一种点对点的数据传输方式,常用于串口通信。 dw_apb_uart是一种UART驱动,它是基于ARM公司的AMBA总线协议的一种外设控制器。 dw_apb_uart利用DMA和FIFO等技术,可以提供高效的数据传输功能,能够快速传输大量数据。它还支持多种数据格式,包括8位、9位、10位以及可变的数据位数。此外,dw_apb_uart还可以实现多种调制解调器控制和通信协议,如RS-232、RS-422和RS-485等。 作为一种高性能的外设控制器,dw_apb_uart还具有可扩展性和灵活性。它可以通过配置和编程实现各种不同的应用场景,如数据采集、通信设备、自动化控制等。 总的来说,dw_apb_uart作为UART驱动,具有高效、灵活、可扩展等优良特性,是一种非常实用的外设控制器。 ### 回答2: UART是一种通用的串行通信协议,被广泛用于多种应用中,比如通信、调试和控制等。DW_APB_UART是一种UART驱动,是DesignWare家族产品的一部分。它支持UART的基本功能和高级功能,包括9位数据位、校验和多种波特率。DW_APB_UART具有高灵活性和可靠性,可以与多种IP核和SoC平台兼容,降低了设计复杂度和成本。 DW_APB_UART驱动程序基于ARM的APB总线(Advanced Peripheral Bus)协议,通过在SoC内部集成APB总线控制器来实现与CPU的通信。APB协议是一种低带宽、低功耗的总线协议,具有流水线式的传输结构。DW_APB_UART驱动程序通过APB协议与CPU进行通信,实现UART功能的协议管理和数据传输。此外,DW_APB_UART驱动程序还支持中断和DMA传输机制,提高了数据传输效率和系统可靠性。 DW_APB_UART驱动程序可以通过多种编程语言来实现,比如C语言、汇编语言等。DW_APB_UART还提供了一组应用编程接口(API),可以帮助开发人员简化开发工作。DW_APB_UART驱动程序的开发需要掌握APB协议、UART协议以及系统级编程等技能,需要对硬件电路和软件驱动等领域有一定的了解。 总之,DW_APB_UART驱动程序是一种高可靠性、高灵活性的UART驱动,具有广泛的应用前景。它可以帮助开发人员实现UART通信功能,降低开发成本和时间。 ### 回答3: DW_APB_UART是一款优秀的UART控制器驱动,它可以和处理器内部的APB总线进行通信,支持多种工作模式,并提供了灵活的数据传输接口,可广泛应用于各种串行通信应用场景中。 在DW_APB_UART驱动中,主要包括数据收集、数据传输和中断处理三个部分。在数据收集方面,驱动会从物理层获取接收到的串行数据,并进行缓存处理,以确保数据不会丢失;在数据传输方面,驱动支持多种常见的通信协议,如UART、IrDA和Modem等协议,并可以根据需要灵活配置相应的参数;在中断处理方面,驱动支持FIFO溢出、接收错误、传输完成等多种中断类型,并根据中断类型进行相应的处理操作。 除此之外,DW_APB_UART驱动还具有很高的可配置性和可扩展性,部分功能如FIFO深度、波特率、校验位和停止位等参数均可通过寄存器进行配置,使得驱动可以应对不同的应用场景和外设需求。 总的来说,DW_APB_UART驱动通过简单的接口和灵活的配置参数,提供了一种高效、可靠、灵活的串行通信解决方案,并成为许多嵌入式系统中必不可少的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值