一,前言

今天玩一下US100超声波传感器。5年前玩寻路小车的时候用过,已经忘记了。先看了下它的原理,除了支持gpio还支持uart的。给它输入0x55命令可以获取2个字节的距离mm信息。那么我就用下串口子系统。基于console的其实一直在用,但是我都没了解过tty的框架。正好网上了解下,资料比较多,我就不多说。配置完设置树,使用8250底层uart驱动及tty驱动,所以驱动不用自己写,配置完设备树,写了read/write APP就能用了。工程已上传我的gitee工程13。

二,设备树修改

a.先用PC串口调试助手使用了下US100。验证器件正常。GND我就连接了一根。

image.png

b.看了下datasheet及原理图,决定使用UART1。

am335x-bone-common.dtsi修改下

uart1_pins: pinmux_uart1_pins {

pinctrl-single,pins = <

AM33XX_PADCONF(AM335X_PIN_UART1_RXD, PIN_INPUT_PULLUP, MUX_MODE0)

AM33XX_PADCONF(AM335X_PIN_UART1_TXD, PIN_OUTPUT_PULLDOWN, MUX_MODE0)

>;

};

&uart1 {

pinctrl-names = "default";

pinctrl-0 = ;

status = "okay";

};

image.png

三,遇到的问题

1. 到底注册到哪个设备了,那么多tty。

log信息可以看出注册到了ttyS1

[ 1.013776] Serial: 8250/16550 driver, 6 ports, IRQ sharing enabled

[ 1.019091] 44e09000.serial: ttyS0 at MMIO 0x44e09000 (irq = 29, base_baud = 3000000) is a 8250

[ 1.814064] printk: console [ttyS0] enabled

[ 1.820211] 48022000.serial: ttyS1 at MMIO 0x48022000 (irq = 35, base_baud = 3000000) is a 8250

设备描述中也可以看到更详细的内容。

# pwd

/sys/bus/platform/drivers/omap8250/48022000.serial

# ls -al

total 0

drwxr-xr-x 5 root root 0 Jan 1 00:02 .

drwxr-xr-x 4 root root 0 Jan 1 00:02 ..

lrwxrwxrwx 1 root root 0 Jan 1 00:02 driver -> ../../../../../../../bus/platform/drivers/omap8250

-rw-r--r-- 1 root root 4096 Jan 1 00:02 driver_override

-r--r--r-- 1 root root 4096 Jan 1 00:02 modalias

lrwxrwxrwx 1 root root 0 Jan 1 00:02 of_node -> ../../../../../../../firmware/devicetree/base/ocp/interconnect@48000000/segment@0/target-module@22000/serial@0

drwxr-xr-x 2 root root 0 Jan 1 00:02 power

lrwxrwxrwx 1 root root 0 Jan 1 00:02 subsystem -> ../../../../../../../bus/platform

drwxr-xr-x 3 root root 0 Jan 1 00:02 tty

-rw-r--r-- 1 root root 4096 Jan 1 00:02 uevent

drwxr-xr-x 3 root root 0 Jan 1 00:02 wakeup

# cd tty

# ls

ttyS1

2. write一直阻塞。

我的app是先write 0x55,然后read 2字节,结果write就阻塞了。怀疑线反了,反接后依然write 阻塞。于是用示波器,看了下波形幅度值不到5。所以将usb上电改成了电源上电。问题解决。示波器发送0x55截图如下,

image.png

另外,我用echo -e -n "\x55" > /dev/ttyS1截图也是一样的。并且由于发送成功,所以我截取rx脚,接收也成功。接收2字节如下图

image.png

3. read一直阻塞

示波器都已经显示read有正常的波形,但是read一直被阻塞。我怀疑杜邦线断了,用万用表测量线正常。难道是没有进入中断。我之前看框架的时候ftrace也跟踪过,但是ftrace内容太多了,因为uart0也是用8250,所以我区分不了。那么从/proc/interrupts来查看中断。如下可以看出35号中断一开始是没有的,运行了us程序后,35号中断出现。最后我只能看源码,当然最快的速度是网上找下框架资料,比如接收中断是哪个函数,然后又会调用哪里。接着找到了线索,他描述的接收中断居然是从console输入作为接收中断的,然后echo回显到console。那么我立即想到一个问题,我不用console的,是否就不能唤醒read中。所以是否有些设置bypass console。本来想看了document的帮助,因为我觉得linux的串口驱动不会有bug的,先网上搜索下,立即得到答案。原来需要设置raw模块的串口通信。在raw模式下最后运行app,获取结果正确。

# cat /proc/interrupts

CPU0

16: 618 INTC 68 Level gp_timer

18: 0 INTC 3 Level arm-pmu

19: 8 INTC 12 Level 49000000.edma_ccint

21: 0 INTC 14 Level 49000000.edma_ccerrint

28: 0 INTC 96 Level 44e07000.gpio

29: 108 INTC 72 Level 44e09000.serial

30: 146 INTC 70 Level 44e0b000.i2c

43: 0 INTC 98 Level 4804c000.gpio

44: 37 INTC 64 Level mmc0

46: 0 INTC 30 Level 4819c000.i2c

47: 0 INTC 32 Level 481ac000.gpio

48: 0 INTC 62 Level 481ae000.gpio

49: 47 INTC 28 Level mmc1

53: 1191 INTC 41 Level 4a100000.ethernet

54: 689 INTC 42 Level 4a100000.ethernet

57: 0 44e07000.gpio 6 Edge 48060000.mmc cd

58: 0 INTC 7 Level tps65217-irq

IPI0: 0 CPU wakeup interrupts

IPI1: 0 Timer broadcast interrupts

IPI2: 0 Rescheduling interrupts

IPI3: 0 Function call interrupts

IPI4: 0 CPU stop interrupts

IPI5: 0 IRQ work interrupts

IPI6: 0 completion interrupts

Err: 0

# cd /usr/study/

#

# ./us &

# ok

# cat /proc/interrupts

CPU0

16: 1012 INTC 68 Level gp_timer

18: 0 INTC 3 Level arm-pmu

19: 8 INTC 12 Level 49000000.edma_ccint

21: 0 INTC 14 Level 49000000.edma_ccerrint

28: 0 INTC 96 Level 44e07000.gpio

29: 247 INTC 72 Level 44e09000.serial

30: 146 INTC 70 Level 44e0b000.i2c

35: 0 INTC 73 Level 48022000.serial

43: 0 INTC 98 Level 4804c000.gpio

44: 37 INTC 64 Level mmc0

46: 0 INTC 30 Level 4819c000.i2c

47: 0 INTC 32 Level 481ac000.gpio

48: 0 INTC 62 Level 481ae000.gpio

49: 47 INTC 28 Level mmc1

53: 1373 INTC 41 Level 4a100000.ethernet

54: 764 INTC 42 Level 4a100000.ethernet

57: 0 44e07000.gpio 6 Edge 48060000.mmc cd

58: 0 INTC 7 Level tps65217-irq

IPI0: 0 CPU wakeup interrupts

IPI1: 0 Timer broadcast interrupts

IPI2: 0 Rescheduling interrupts

IPI3: 0 Function call interrupts

IPI4: 0 CPU stop interrupts

IPI5: 0 IRQ work interrupts

IPI6: 0 completion interrupts

Err: 0

四 测试结果正确

不同的障碍物距离,显示的结果不同。

# stty -F /dev/ttyS1 9600 raw

# ./us

ok

write 0x55

distance is 91

write 0x55

distance is 45

write 0x55

distance is 198

write 0x55

distance is 120

write 0x55

distance is 1579

五,参考网址

linux raw串口,linux下串口raw驱动(US100超声波)--Apple的学习笔记相关推荐

  1. linux 应用层gpio中断_linux下GPIO中断驱动US100传感器--Apple的学习笔记

    一,前言 资源就的利用起来.linux下串口raw驱动(US100超声波)--Apple的学习笔记已经用US100玩了串口,US100还可以用GPIO和中断来玩.原理就是triq发送大于10us的高电 ...

  2. 永久解决Linux(Ubuntu)下安装CH340驱动问题

    永久解决Linux(Ubuntu)下安装CH340驱动问题 出现的问题 出现的问题 当我们用make对CH340的文件进行构建的时候,大多数情况是会报这样的错误 下面提供一种永久解决的方法 首先打开下 ...

  3. linux的can通信busoff,socketCAN内核源码分析是否支持busoff自恢复--Apple的学习笔记

    大总结:诊断小系统搭建步骤总结--Apple的学习笔记的剩余问题2中,我说过要深入下socketCAN内核源码学习.因为这个小项目关于驱动开发太顺利了,导致学习不到什么东东.最主要我一开始走了捷径,看 ...

  4. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

  5. gtx1070显卡 linux,Ubuntu 16.04下Nvidia 显卡驱动安装

    环境: Ubuntu 16.04 64bit Nvidia GeForce GTX 1070 解决了个人遇到的一些问题. 获取驱动 安装驱动的途径有很多,如run文件.deb文件.PPA源.apt-g ...

  6. linux 数位板内核,Ubuntu 下友基数位板驱动和配置

    友基的板子的芯片是UC-LOGIC.....我的系统 Ubuntu 13.04 64BIt 第一部分 ubuntu通过软件源的方法装数位板驱动 ubuntu 10.04以上 ppa:doctormo/ ...

  7. linux zynq usb0,Ubuntu下ZedBoard USB-Jtag驱动安装及双核调试

    开发环境说明 Ubuntu 12.04 LTS Xilinx最新的基于zynq-7000 AP SOC平台的ZedBoard开发板的USB-Jtag驱动安装方法 运行前准备 % sudo dpkg-r ...

  8. 开发linux显卡驱动,显卡驱动开发DRM入门--Apple的学习笔记

    由于之前的blog提及kmscube的源码我没有找到,所以只能在网上搜索了. DRM简介 DRM是Linux目前主流的图形显示框架,同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统 ...

  9. linux下json数据解析,JSON数据解析 - iOS学习笔记_Linux编程_Linux公社-Linux系统门户网站...

    在之前的<iOS学习--xml数据解析(九)>http://www.linuxidc.com/Linux/2014-02/97020p9.htm 介绍了xml数据解析,这一篇简单介绍一下J ...

  10. linux中如何设置组id,linux 下设置用户ID 和 设置组ID 学习笔记

    因为某种原因 感觉心里一直有想把Unix有关文件权限编程这部份弄懂的想法,  所以第三遍看Unix高级编程第四章, 以前都是一眼带过, 根本没看吃透, 再次看感觉懂了蛮多的, 写下了以后复习用! 一: ...

最新文章

  1. 基于OSS存储搭建Hadoop集群
  2. linux c 时间函数 time difftime 简介
  3. Mysql 8主从复制配置图解
  4. 操作系统:分享Win11几个实用小技巧,赶快收藏吧!
  5. LeetCode 401. 二进制手表
  6. 信息学奥赛一本通(1171:大整数的因子)
  7. 静态方法中调用spring容器中的对象
  8. ESFramework介绍之(28)―― Udp组件
  9. 音创linux版e100加歌,【图片】音创高清点歌机E100-3D版 火爆上市 现将资料爆出_点歌机吧_百度贴吧...
  10. matlab语法总结
  11. TA进阶实例33(Unreal制作魔兽世界透视效果)
  12. MySQL 8.0.27 下载安装与配置详细教程(Windows64位)
  13. android密度计算器,密度计算器
  14. 记录下准备蓝桥杯的过程吧
  15. 渥太华大学计算机学硕录取过程,西农计算机拟录取名单公布,初试第一被刷,289分倒数第一上岸...
  16. 服务器操作系统有哪些?
  17. 还在用excel做应收应付管理吗?你的痛苦我都知道
  18. 宠辱不惊,闲看庭前花开花落;去留无意,漫随天外支卷云舒。【菜根谭】
  19. 在Chrome中选择了“始终允许在关联的应用中打开此类链接”,如何取消关联?
  20. Angular之HelloWorld——Angular(1)

热门文章

  1. 把握linux内核设计思想系列【转】
  2. Keil MDK浮点数支持不正常的解决方案
  3. 支持ie与FireFox的剪切板代码
  4. ASP.NET MVC分页的实现(上)
  5. linux下mysql5.7以上my.cnf配置文件配置
  6. Spring Boot和Dubbo整合
  7. 理解 Python 中的线程
  8. PHP导出数据库数据字典脚本
  9. git根据commit生成patch(转载)
  10. Android消息推送(Android Push Notification)