背景:
公司的板子,对于HDMI的显示器热拔插不支持,只能在插入HDMI时启动才能输出,而当开机之后,再插入HDMI显示器则无输出,不知道原因。
推测如下:
1、设备树的引脚配置有误,导致插入HDMI显示器时,系统无法检测到新设备;
2、系统驱动有问题。
因此借着这个机会,学习下韦东山视频,看是否能够有所帮助。
————————————————————————————————————————————————————————
当注册了设备之后,为什么还要注册类和类设备?
是为了让mdev根据这些信息来创建设备节点。
下面分析class_device_create函数,
调用到了kobject_uevent
具体的调用暂时先不去细看,先看下思路
其中,在打印环境变量时,由于不能确定有多少个环境变量,所以使用了一个技巧
for(i=0; envp[i];i++)
do something;
即只要envp[i]存在就能判断成功,从而执行打印。
envp是char**类型的变量,打印时只写写字符串地址即可,即%s, envp[i]
总结:
当创建一个设备的时候,会导致mdev用户程序的运行,根据环境变量创建设备节点。
而当插入U盘,是如何自动挂载的。
分析:
插入U盘后的现象,自动在/dev/路径下创建sda等设备节点。
分析/etc/mdev.conf配置文件,发现配置文件正则表达式如下:
mdev.conf的格式:
: [<@||∗>]@Runaftercreatingthedevice.|∗>]@Runaftercreatingthedevice. Run before removing the device.
* Run both after creating and before removing the device.device regex: 正则表达试,表示哪一个设备
uid: onwer
gid: 组ID
octal permissions: 以八进制表示的属性,权限@: 创建设备节点之后执行命令
$: 删除设备节点之前执行命令
*: 创建设备节点之后 和 删除设备节点之前 执行命令常用正则:
. 表示任意字符,(换行符除外)
* 重复0次或者更多次
+ 重复1次或者更多次
? 重复0次或1次
[abc] 表示这些字符里的某一个
————————————————
版权声明:本文为CSDN博主「dotafast」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012617366/article/details/73557068
综上,也就是说,在韦东山的视频教程中,相当于讲解了系统在识别出设备之后做的操作,而没有去详细讲解系统如何检测到有新设备热插拔了。
而目前的问题,可能很大程度上是由于系统没有检测到新设备,或者说系统没有去检测是否有新设备。
不过,视频教程还是有帮助的,可以快速的有个入门的概念。
下面就要从HDMI入手,去尝试分析和解决问题。
首先,要先去了解HDMI接口的概念,参考博客:
https://blog.csdn.net/wurifeng0531_201702/article/details/59212811
得知,板子的HDMI接口是标准型,共19pin。但是每个pin的作用是什么,并未有详细说明,只是从图中可以看出,有3组数据传输接口,每组分为data +,data shield ,data -三个引脚。另有一组时钟引脚clock +, clock shield, clock -
以上四组引脚,均有前缀TMDS,百度百科如下:
个人推测如下:
每组引脚中,data + 和data -传输的信号是相反的,这样可以避免外部干扰引起的数据错误,因为差值是一定的,shield引脚起保护作用,接地。
以上共有12个引脚(pin1~pin12),其他的7个引脚作用:
https://www.cnblogs.com/cute/archive/2011/05/25/2056417.html
pin19,hot plug detect 很明显