大家好,欢迎大家观看讯雷电子的利克斯视频。上节课我们学习了在应用程序中,如何通过 iphone c 总线进行 iphone c 通讯。那在应用程序中,为什么我们可以直接使用 open 函数打开对应的设备节点, 然后调用 i o control 函数就可以实现 iphone c 通讯呢?通过之前学习到的知识,我们知道,在应用程序中使用 open 函数打开设备节点,那是不是就要有这样的一个驱动程序,在驱动程序中创建这个设备节点呢? 在应用程序中,我们使用 i o control 函数, open 函数。那在驱动程序中,是不是就要提供 i o control 和 open 函数呢? 因为在应用程序中,我们使用 open i o control 函数,它会执行驱动中的 open 和 i o control 函数,那这个驱动程序是 linux 中通用的 iphone c 驱动程序,所以这节课我们就来分析一下这个通用的 iphone c 驱动程序。同学们直接看老师的讲义, 在编写应用程序的时候,我们是不是包含了一个名为 iphone c 杠 dy 点 h 的 头文件呢?所以在 linux 中,这个通用的 iphone c 驱动程序,它的名字叫 iphone c 杠 d e v 点 c。 这个通用的驱动程序在 linux 内核原版的这个路径下,我给同学们看一下。 所以在这个通用的 iphone c 驱动程序中,就创建了设备节点,给应用程序提供了 open、 read、 write、 l control 等这些接口函数。这个通用的 iphone c 驱动程序,在内核原码的这个路径下, 如果我们想使用这个通用的 iphone c 驱动程序,我们需要先把这个驱动程序编进内核。如果同学们用的是我们的开发板,在我们的开发板中,这个驱动程序已经默认编进内核了。如果说你用的不是我们的开发板,或者你用的开发板 内核中没有变异,这个通用的驱动程序你需要先使能一下,它如何使能呢?以我们的二 k 三五六八开发版为例,我们进到二 k 三五六八开发版的内核原码目录下,然后我们使用这条命令把它设置成 m 六十四的。 因为二 k 三五六八它是 m 六十四的,所以这里我们要把它设置成 m 六十四。那如果说你用的是其他的卡板,比如 imax 六 u, 它是不是 m 三十二呢?所以你这里就要把它设置成 m 三十二的。 设置好了以后,我们打开 make menu configure 图形化配置界面,然后我们检查左上角,这里是不是 m 六十四的,如果是叉八六的或者是 m 三十二的就不对,你需要按照刚才的方法设置一下。 如果说你用的插板是 m 三十二的,那这里显示 m 三十二就是正确了啊,这里老师强调一下。然后我们找到 device driver 这个选项,在这个选项中,我们找到 iphone c support, 在 这个选项中,我们将 这个选项给它选中,也就是设置成星号。你如果说这里是空的,也就是没有选中它,那它就不会编辑内核。如果是 m, 就是 把它编辑成 ko, 这里呢,我们把它设置成星, 然后我们保存并编辑内核,就可以把这个驱动程序编辑进去了。那如果这块的知识同学们忘记了,或者不了解,同学们回过头看老师讲解的第一期的视频,我们将它编辑进内核以后,系统在启动的时候就会在 dv 目录下生成对应的设备节点。 那接下来我们分析一下这个驱动程序,我们是不是需要从驱动的入口函数开始分析呢? 在驱动的入口函数中,先注册了一个设备号,然后创建了一个名为它的类, 接下来将组设置成 iphone c groups。 那 这些知识是不是就是之前老师讲解字母设备的时候给同学们讲解过的知识呢?所以我们大致能感觉到这个驱动程序它是不是用字母设备去写的呀?然后接下来创建了一个同指令, 这个通知链是用来干啥的呢?它是用于监听 iphone c 适配器的增价和删除的,紧接着就便利 iphone c 适配器并调用这个函数绑定设备,也就是这就在那。所以接下来我们得分析一下这个函数。 在这个函数中,先判断设备的类型是不是 iphone c 适配器,如果不是, iphone c 适配器就直接 return 零, 因为这个函数它要循环便利 iphonec 适配器并绑定设备。所以第一步它就得先判断设备的类型是不是 iphonec 适配器,然后通过这个函数,通过 device, 也就是它 获取到 iphonec 适配器的结构体,也就是这个结构体。接下来调用这个函数,这个函数是做什么的呢?这个函数是不是就是将 iphonac adapter, 也就是 iphonac 适配器附着给了这个结构体中的这个成员呀?并且给这个结构体分配了空间,然后将它加到了这个链表上, 所以这句代码的作用就是给 iphonac 适配器分配一个这个 iphonac device 结构体,并把它放到这个链表当中,同学们看这句代码是不是就是这个意思呀? 接下来是不是就注册了一个字母设备呀?那这些代码是不是之前老师在讲解字母设备的时候给同学们讲解到的知识呢? 然后节点的名字是不是在这设置的呢?也就是 iphone c 杠零或者是杠一杠二,同学们看这个百分号 d, 它是不是等于 iphone c 适配器中的 n 二,那这个 n 二老师当初是不是说它是总线编号呢?也就是 iphone c 零后面的零, iphone c 一 后面的一。 那所以在讲应用程序的时候,老师说这个设备节点啊,它可以代表一个 iphonec 控制器,那其实也就是在这啊看出来,但是啊,它并不是 iphonec 控制器的设备节点, 在创建字体设备的时候,它是不是得实现文件操作级函数呢?也就是 file operations 结构体,所以接下来我们是不是就得分析一下这个结构体呢? 在编写出膜芯片 f t 五叉零六驱动程序的时候,老师是不是说,如果我们写的这个驱动程序需要给应用程序提供 open、 read、 write、 io、 control 这些函数,是不是就要在 power 函数中注册一个字母设备,或者注册一个杂项设备呢? 如果不需要的话,那你可以不注册,比如像 f t 五叉零六这样,那如果你需要注册一个制服设备或者杂项设备,那你是不是就得和通用的 iphonec 驱动程序中这里这样操作一下呢? 那 fail operations 结构体是不是就是它呢?我们来看一下,在这个结构体中,它就实现了 read、 write、 l control、 open、 release 这些结构函数,那这个 lsic 它是 no lsic, 也就是没有去实现, 没有去实现。我们先来看 read 的 函数,我们先来看 open 函数吧, 在应用程序中,使用 open 函数打开对应的设备节点,是不是就会执行驱动中的 open 函数呢?也就是它。那在驱动中的 open 函数中都做了哪些事情呢?同学们看老师在讲议,第一步,先通过 i node 号获取到设备号, 然后通过设备号获取到对应的 iphone c 适配器,也就是 iphone c adapter。 接下来给 iphone c client 结构体分配内存。 之前老师是不是说 iphonec 驱动程序分成了 iphonec client 和 iphonec driver 两个部分呢?那这个通用的 iphonec 驱动程序,它的 iphonec client 既不是用的设备数,也不是用的单独的 c 文件,它是直接在驱动程序中创建了一个 iphonec client, 也就是在 open 函数中创建的。然后接下来是不是就要构建 iphonec client 结构体呢?通过这句代码设置了 iphonec client 中的名字, 然后将 iphonec client 中的 iphonec adapter 设置成了这里获得到的 iphonec adapter。 那 是不是就说明这个 iphonec client 是 挂载到了这个 iphonec client? 那在其他的函数中,比如 read, write, i o, ctrl 中,是不是就可以通过这个所有数据拿到这个 iphone c client 呢?这个就是 open 函数的作用。 然后我们再来看读函数,同学们看,这个通用的 iphone c 驱动程序中,它实现了读函数和写函数。 那是不是就是说在应用程序中,我们不光可以通过 i o control 函数来实现 i f c 通讯,也可以通过读函数和写函数来实现 i f c 通讯呢。所以这节课讲完,老师留的一个课后作业就是在应用程序中使用读函数和写函数实现 i f c 通讯。 这个课后作业,等同学们看完了驱动中的读函数和写函数之后就会写了,因为它的思路和我们之前学习的字体设备的思路是一模一样的,一丁点都不带差的。我们先来看读函数, 在读函数中,先通过私有数据拿到对应的 iphonec client, 然后给读渠道的数据分配空间, 接下来直接调用这个 api 函数。同学们看这个 api 函数眼熟吗?这个 api 函数是不是就是老师之前在讲解触摸芯片 f t 五叉零六的时候给同学们讲解到的 api 函数呢?那这个 api 函数也就是它最终是不是会调用 iphonec transfer 这个 api 函数呢? 所以在这个通用的 iphonec 驱动程序中,它也是通过 iphonec transfer 这个 api 函数来实现 iphonec 通讯的。是不是和触摸芯片 f t 五叉零六实现 iphonec 通讯的原理是一样的呢?然后调用 copy to user, 那调用它的目的是不是就是拷贝到用户空间呢?同学们看这个思路是不是和我们之前在讲解字母设备的时候,我们实现读函数的思路是一样的呢?也就是 把对应的数据通过 copy to user 拷贝到用户空间。那这个数据是怎么来的呀?是不是调用这个 api 函数通过 iphone c 总线读到的呀?那这里是不是又和我们之前讲解的这里是一样的呀? 所以同学们看这个通用的 iphonec 驱动程序,它的编写思路是不是也是很巧妙的呀?然后我们再来看写函数,那写函数是不是也是这样的呀? 先从私有数据中拿到对应的 iphonec client, 然后给写入的数据分配缓冲区。接下来呢,是不是就调用这个函数呀?那调用这个函数,它是不是最终也会去执行 iphonec transfer 这个 api 函数?那写的这个数据是从哪来的呀?是不是就是 通过这个函数在应用空间中拷贝过来的呀?因为在这个函数中,它调用了 copy from use, 这个呢,就是读函数和写函数。如果说你有认真的跟着老师每一期啊都学过来,我相信这个课后作业,也就是在应用程序中打开设备节点以后,使用 read 和 write 实现这个 iphone c 同学,我相信你就会写了。 最后我们看 i o control 函数, i o control 函数有两个啊,它是为了兼容三十二位和六十四位,这里呢,我们就看它就可以了。 在 i o control 函数中,它是不是需要用 switch case 命令来区分每一个命令执行的代码呢?跟我们之前讲解的 i o control 函数的思路是一样的,在编写应用程序的时候,我们使用到的命令是 iphone c r d w r, 所以 我们只看这个命令对应的操作就可以了, 其他的我们就不看了。在这个命令中,它是不是需要先使用 copy from user 来拷贝数据呀?然后 调用这个 api 函数,调用这个 api 函数,它的最终目的,同学们看是不是就是用 iphonec transfer 实现这个 iphonec 通讯呢? 所以在应用程序中,我们是不是也得去构建这个 iphonec message 结构体呢?因为我们在编辑触摸芯片 f t 五叉零六这个驱动程序的时候,在调用 iphonec transfer 之前,是不是也是先创建这个结构体呢? 同学们看这个驱动程序,它是不是就相当于你把这些东西给拿到了应用程序里面啊? 然后我在驱动程序中,在应用程序里面拿到这些数据,然后呢也是去调用 iphonec 传感器这个 api 函数,所以它就能实现这个通用,也就是说它把不一样的地方给拿出去了。那什么地方不一样呢?那是不是就是这个 iphonec message, 也就是你要通过 iphonec 总线发送和接收的这个数据包不一样, 把这个数据包拿出去,拿出去之后,那像这个 iphone c transfer 实现 iphone c 通讯的这些东西,它是不是就是通用的呢?所以这个驱动程序它就能实现通用。 同学们可以自己捋一下这个驱动程序,这个驱动程序啊,也不难,因为它本质上就是一个制服设备啊。如果说啊,同学们不愿意自己去分析这个驱动程序,那同学们需要掌握的就是如何去使能它, 如何使用 i o control 函数来实现这个 iphone c 通讯?和我们下节课的 qq 作业如何使用 read 和 write 函数实现这个 iphone c 通讯?这节课老师就先。
粉丝997获赞2640

大家好,欢迎大家观看讯媒电子的利克斯视频。在驱动程序中,通过 iphone c transfer api 函数就可以通过 iphone c 总线进行通讯。那在应用程序中,我们要如何操作 iphone c 呢?这节课我们一起探讨下这个问题。 我们直接写实验代码,这节课的实验是我们第一百零七个实验,我们创建一个第一百零七个实验目录, 然后创建一个 c 文件,我们使用 ysl 的 打开这个 c 文件,然后把程序框架写出来,先包含 s, t, d, l 点 h, 然后是慢函数, 我们打开之前写的驱动程序,在驱动程序中调用 iphonec transfer api 函数进行 iphonec 通讯之前是不是创建了 iphonec message 这个结构体呢?也就是先对 iphonec 数据进行封包的操作。 同理,在应用程序中,我们要操作 iphone c 总线进行通讯,也要先对数据包进行封包。在应用程序中, iphone c 的 数据包用哪个结构体来表示呢? 我们先包含两个头文件,第一个头文件是 linux 下面的 iphone c 点 h, 第二个头文件是 linux 下面的 ifon c 横杠 d e v 点 h, 然后我们打开 ifon c 横杠 d e v 点 h。 这里同学们要打开这个路径下的 ifon c 横杠 d e v 点 h, 不要打开错。 在这个投文件中,我们可以找到这样的一个结构体,也就是 iphone c 二 d w r i o control date。 同学们看这个结构体是不是就把 iphonec message 和 iphonec message 的 数量进行了进一步的封装呢? 所以在应用程序中,我们在调用相关的 api 函数进行 iphonec 的 数据进行封包。那本质上 和驱动程序中,这里创建 iphonec message 是 一样的,只不过在应用程序中对这两个成员做了进一步的封装而已。 在编写驱动程序的时候,我们对 iphonec 外设 f t 五叉零六进行操作之前,是不是写了一个读函数和一个写函数呢?同理,在应用程序中,我们通过 iphonec 总线操作 iphonec 外设,比如 f t 五叉零六,是不是也得先写一个读函数和写函数呢? 这里我们先写读函数,我们把驱动程序中的这个读函数先复制过来。 u 八,我们改成无符号的叉类型。 iphone c message 中的这个 a d d r 我 们通过行餐传递进来 这里呢?我们也是使用这个无符号的这个叉类型。 在应用程序中,我们不能调用 iphonec transfer api 函数,所以这句代码我们把它删掉。 刚才老师说,在应用程序中,我们要创建这个结构体,所以我们是不是得定义一个这样的结构体呢?这个结构体的名字我就叫 iphonec 下划线 message, 然后这个结构体中的 messages 这个成员,它是不是就等于我们这里创建的这个 messages? 呃,这个 messages 我 们给它改个名字,我们叫 d e v 下划线 messages, 然后这个结构体里面的 messages 的 数量,它是不是就等于二呢?为什么是二呀?我们数一下就知道了,一个两个是不是就是二呢?然后其他的 也就是为什么这里有两个 iphonec message, 它的到底是不是和我们在编辑驱动程序的时候是一样的呀?所以这里就不再给同学们解释了。 那在应用程序中,我们要调用哪个 api 函数进行 iphonec 通讯呢?刚才老师你说了,在应用程序中,你是不能调用 iphonec transfer 的。 我们看这个头文件,在这个头文件中,这里有段注示,它说 i o control 命令 是这个设备节点的 i o control 命令,这个设备节点它代表的是什么呢?这个设备节点也就是 d e v 下面的 iphone c 叉,这个叉可以等于零一二三四五,对应的也就是 iphone c 零, iphone c 一, iphone c 二, 这个设备节点对应的就是 iphonec 控制器。同学们想一下,我们对这个设备节点进行操作,是不是就可以操作 iphonec 控制器呢?之前老师说 iphonec 控制器它可以产生 iphonec 通讯的相关的波形, 那我们操作这个节点就是操作 iphone c 控制器,那它是不是就可以进行 iphone c 通讯了呢?然后这里它告诉我们,操作它的话有 i o control 的 命令。所以在应用程序中,我们进行 iphone c 通讯,是不是就用 i o control 就 可以了呢? 那 linux 都给我们提供了哪些 i o control 的 命令呢?有这么多个,那每个命令的作用是什么?都给我们进行了注示。进行 iphone c 通讯,我们只用到一个命令,也就是它 iphone c 下划线二 d w i, 也就是 iphone c 的 读写操作命令。 所以接下来我们在这个函数中,我们调用 i o control 是 不是就可以了呢?我们先把 i o control 的 头文件包含一下, 呃,这里我们需要包含 s y s 下划线 i o control 点 h。 我 们定义一个 int 类型的变量 r e t。 如果同学们忘记了 i o control 相关的知识,那同学们回过头去看老师讲的字母设备的这个专题里面是有讲过的, i o control 它的第一个参数是不是 f d 呢?也就是锯饼,这个锯饼我们是通过 open 函数获得的, 所以这里呢,我们要将它作为一个行餐传递进来,所以这里我们再写一个行餐 int 类型的 f d, 那 这个 f d 就 要放到这里。第二个参数是不是就是 i 放 c 的 命令呀?这里我们要使用这条命令,这条命令它实际上就是对应的 i o control 的 命令。 最后一个参数是不是就是我们在这里写的这个数据包呀?也就是它。那同学们说,为什么在应用程序中 要对这个 iphonec message 和 iphonec message 的 数量进行这个封装呢?进行封装的原因就是要调用 i o control 函数,在调用 i o control 函数的时候,我直接传这个结构体的地址就可以了,所以说在应用程序中又进行了一个封包的操作, 然后我们判断一下这个 i e t if, 如果 i e t 小 于零的话,那它是不是就失败了呀? 我们这里使用 printf 打印一句话,这里我们打印 read 按钮, 这样我们的读函数就写好了。接下来我们边写写函数,我们把驱动程序中的写函数复制过来。 u 八,我们改成无符号的字母型。 u 十六,我们改成 int 类型 iphone c transfer 这句代码我们给它删掉,然后这里我们通过行餐传递进来, 行餐中是不是也得有一个 f d 呢?所以我们把它也粘过来,我们也是先定义一个这样的结构体, 然后给这个结构体改个名字,这里面的器件的地址是不是就是从这里传递进来的呢? 然后我们给这个结构体的成员赋值 iphonec message 的 数量,这里是不是就应该为一呢?因为这里面是不是只有一个呢?然后调用 i o control 函数, io control 的 命令是不是还用它呢?因为这个命令既可以读也可以写, 如果写失败的话,我们就提示一句话,那这样写函数是不是也写好了呢?同学们看这个套路是不是和在驱动中进行 iphone c 通讯的套路是大差不差的呢? 有了读函数和写函数以后,接下来是不是就可以对 f t 五叉零六这个 iphone c 外设进行操作了呢?所以接下来我们边写 open 函数,在慢函数中,我们先定义一个 int 类型的变量 f d, 然后使用 open 函数 打开 iphonec 控制器的设备节点。 iphonec 控制器的设备节点叫什么名字呢?首先设备节点是不是都是在根目录的第一位目录下呢? iphonec 控制器的设备节点的名字是固定的百分之九十八的开发版都是以 iphonec 开头横杠加上 iphonec 控制器的编号,也就是 iphonec 零后面的零和 iphonec 一 后面的一 f t 五叉零六这个 iphone c 外设它是挂载到了 iphone c 一 这个控制器上,所以是不是就是横杠一呢? 百分之九十九啊,或者是百分之九十八的开发板,它的 iphone c 控制器的节点都是这样命名的,如果不是这样命名的,你就要具体情况具体分析,你是不是就可以去开发板的第一位目录下看一看这个 iphone c 控制器的节点叫什么名字呀? 然后我们使用 o 下划线 r d w r, 我 们判断一下有没有打开成功。 if 如果 f d 要是小于零的话,是不是就没有打开成功呀? 打开成功以后,我们是不是就可以调用读函数和写函数对 f t 五叉零六这个 iphone c 外设进行操作了呢? 我们先对 ft 五叉零六进行写的操作,我们先调用写函数,第一个函数参数 f d, 也就是我们在这里获得的第二个参数是 iphonec 外设的地址, 那 ft 五叉零六的地址是不是零 x 三八呢?第三个参数是我们要写的寄存器的地址,我们打开 ft 五叉零六的数据手册,我们对这个寄存器进行写操作, 那它的地址是不是就是零 x 八零呢?在编写驱动程序的时候,我们是不是也是操作的这个寄存器啊? 零 x 八零,我们对这个寄存器写的数据是什么呢?比如我们给它写入零 x 五五, 它的长度是一,这样写函数我们就调用好了,然后我们再调用读函数,看看读出来的计算器的值是不是零 x 五五,如果是零 x 五五的话,是不是就可以证明我们写函数和读函数都可以正常工作呢? 我们定义一个变量,这个变量保存的就是这个计算器的值。 调用读函数 第一个参数是 f d, 第二个参数是 iphone c 外设的地址是零 x 三八, 第三个参数是我们要提取的寄存器的地址,我们要提取的寄存器是不是它呢?地址是零 x 八零,所以这里我们写零 x 八零, 然后我们将它的纸打印出来, 这样慢函数我们就写好了,然后我们把 open 函数和这个函数的头文件包含一下,我们先包含 open 函数的头文件, 然后我们再包含 s t r n g 点 h, 这样头文件我们也写好了,那这个应用程序我们也就编写好了。 我们再捋一下思路,在应用程序中通过 iphonec 总线进行通讯,我们是不是需要先编写对应 iphonec 外设的读函数和写函数呢?在编写读函数和写函数的时候, 我们需要先定义一个这样的结构体,然后去创建这个结构体中的 iphone c message, 然后给这个结构体中的成员赋值,也就是 iphone c message 和 message 的 数量,接着调用 i o control 进行 iphone c 通讯。在 linux 中给我们提供了操作 iphone c 的 这些命令,不过我们基本上只用这个命令进行读操作和切操作。 还有一点就是我们在打开 iphonec 控制器的设备节点的时候,这个节点名的格式, 大部分的这个插板都是这样的,只有极少数的它可能不太一样。这里呢,你要特别注意一下,如果说你的 iphonec 外设是挂在到了 iphonec 零上,那你打开的就是第一页下面的 iphonec 横杠零。我们编辑一下这个 app, 看看有没有问题, 我们是不是需要使用交叉编辑器呢? 没有问题,我们把翻译好的可执行文件拷贝到开发板上,现在老师已经把测试 app 拷贝到了开发板上,在这里然后我们连接好硬件,也就是把讯媒的七寸 mp 触摸屏连接到开发板上, 因为这个测试 app 适合触摸屏上的触摸芯片 f t 五叉零六进行 iphonec 通讯。在执行这个测试 app 之前,老师先带着同学们看一下第一位目录下的 iphonec 的 设备节点, 有 iphonec 零、 iphonec 一、 iphonec 二、 iphonec 四和 iphonec 五。没有 iphonec 三,因为一个引角,它既可以做 iphonec 的 sda 和 scl 引角之外,是不是也可以被附用成其他功能呢? 如果被附用成了其他功能,那它就不能作为 iphone c 来使用了。所以这里没有 iphone c 三的原因就是因为 iphone c 三的 scl 和 sda 的 引脚被附用成了其他功能。 那如果说你想让 iphone c 三出来,你是不是需要修改设备数中的 pick ctrl, 将它的附用设置成 iphone c 呢?还有就是 dv 下的这些 iphone c 的 节点,它不是具体 iphone c 外设的设备节点,也就是说 iphone c 一 这个设备节点,它不是 f t 五叉零六这个 iphone c 外设的设备节点,它代表着一个 iphone c 控制器。呃,其实老师这么说也不严谨。呃,同学们可以啊,这样理解, 我们可以通过这个设备节点操作对应的 iphonec 控制器,让它进行 iphonec 通讯。比如我们现在应用程序打开的是这个设备节点,我们就可以操作 iphonec 一 这个 iphonec 控制器和 ft 五叉零六这个 iphonec 外设进行 iphonec 通讯。 设备节点我们看完了,然后我们运行测试 app。 因为现在我们是在应用程序中 和 ft 五叉零六进行 iphonec 通讯,所以我们不用加载这个驱动程序,我们直接运行测试 app 就 可以了。 是不是打印了这个计算器的值是五十五呢?那是不是和我们测试程序中想要的效果是一样的呢?那就说明我们这个测试程序写的是没有问题,这个实验代码同学们也要自己敲一下,如果不敲是很难学会的。

大家好,欢迎大家观看讯维电子利克斯视频触摸芯片 f t 五叉零六的驱动程序。我们已经写好了,这节课我们来编写测试 app。 这节课的实验是我们第一百零六个实验,我们创建一个第一百零六个实验的目录, 我们创建一个点 c 文件,因为我们写的是 app, 所以 不需要 makefile 了,我们打开 app 点 c, 我 们先把应用程序的框架写出来, 我们先包含 s t, d i o。 点 h。 我 们要写一个主函数, 在慢函数中,我们是不是需要先使用 open 函数打开设备节点呢? 那这个设备节点是不是就是我们加载 ft 五叉零六驱动程序在 d e v input 目录下生成的设备节点呢?我们生成的设备节点是不是 d e v input 目录下的 e v e n t 四呢?所以第一步我们先使用 open 函数打开这个设备节点,定义一个变量 f d。 这里同学们要注意,你打开的这个设备节点要以你自己实际生成的设备节点为准,不要我写什么你就写什么。 我们判断一下是不是打开成功了,如果小于零的话就是打开失败。打开失败的话,我们提示一个打印,比如我们就打印 open arrow, 我 们把慢函数的头文件也包含一下。 接下来我们是不是就可以使用 ray 的 函数来读取触摸芯片 f t 五叉零六上报的 x 和 y 的 坐标了呢?所以我们先写一个外部循环, 然后在外部循环中,我们使用 ray 的 函数来读取上报的 x 和 y 的 坐标。 同学们还记得我们在讲输入子系统的时候,老师说数据都是被打包成了数据包,那这个数据包是 inputevent, 那 我们读的时候是不是读的也是这个数据包呢?所以我们定义一个 inputevent 的 结构体, 然后把头文件包含一下, 我们需要包含 linux 下面的 input 点 h, 这样我们是不是就读到了上报的数据包呀?我们这里还需要再包含一个同文件 u n i s t d 点 h, 现在我们需要驱动程序上报的 x 和 y 的 坐标,现在我们拿到了这个数据包,但是我们拿到的数据包中是不是不光有 x 和 y 的 坐标值,是不是还有这些事件呀? 我们使用异符判断来过滤一下, 如果这个数据包的 type 它要是绝对事件的话,也就是 e v abs, 那 是不是就是我们想要的事件呀?因为这里我们不想判断是抬起还是按下,所以这个 k e y 事件我们是不是不需要它呀?那不需要它的话,我们就判断 现在是不是 abs 事件,如果是 abs 事件的话,那我判断这个 code 它是 x 还是 y 的 坐标值, 如果这个 code 它要是 abs x, 那 是不是就是 x 的 坐标值呢?那我就把 x 的 坐标值打印出来。 打印坐标值,我们是不是得打印这里面的 y 六这个成员呢?同理,我们是不是还得打印 y 的 坐标值呢? 测试 app 我 们就写好了,当我们手点击屏幕的时候,这个测试 app 会打印我们点击屏幕的 x 和 y 的 坐标,我们翻译一下这个 app, 看看有没有问题。 我们要使用交叉编辑器, 我们直接使用交叉编辑器所在的绝对路径来编辑这个应用程序 没有问题。我们把编辑好的应用程序拷贝到该开发板上,我们看一下实验现象, 现在老师已经把测试 app 拷贝到了开发板上,然后我们连接好硬件,也就是把讯维的七寸 m p 触摸屏连接到开发板上。连接好硬件以后,加载驱动程序, 通过驱动程序的打印,我们可以确定设备节点是 d e v input 下的 e v e n t 四,所以在应用程序中,我们这里打开的设备节点是没有问题的。 然后运行测试 app, 运行完测试 app 以后,我们点击一下屏幕,同学们看是不是有 x 和 y 的 坐标值呢? 同学们可以自己来验证一下,如果说这个坐标值没有问题,那么就说明你写的这个驱动程序和测试程序是都没有问题的。触摸芯片 f t 五叉零六的驱动程序我们就写好了。 编写一个 iphone c 外设的驱动程序,是不是不光涉及到了 iphone c 通讯的知识,还涉及到了其他许多知识啊?所以有的时候同学们感觉学习 linux 中的 iphone c 感觉很难, 不是因为 iphonec 本身有多难。我们在驱动中实现 iphonec 通讯,是不是只需要按照要求创建数据包,然后调用 iphonec transfer 这个 api 函数就可以进行 iphonec 通讯了呢?甚至你都不需要知道 iphonec 的 波形, iphonec 的 协议是什么样子的,你就可以使用 iphonec 进行通讯。 你感觉难的原因就是因为在一个 iphonec 外设的驱动当中, iphonec 通讯它只作为最基础的一个知识点, 还涉及到了其他很多的知识。同学们看这个 f t 五叉零六的驱动程序是不是涉及到了中断,涉及到了 g p i o 子系统,涉及到了 input 子系统 等等这些知识啊?所以这也就是为什么老师要把 iphone c 这个转体放到课程的后面给同学们讲解,也是有这点考虑的,同学们可以自己再细细的品味一下 linux 的 iphone c。

触觉智能 r k 三五七六系列硬件方案多路 a h d 摄像头输入功能焕新升级,现已支持开源鸿蒙系统,通过相机服务 api 接口实现本次演示使用触觉智能 r k 三五七六行业主板,以常见的四路一零八零 p 输入为例,在开源鸿蒙系统表现流畅, 接下来对视频输入与输出之间的延迟进行实测,使用秒表进行对比,整体延时表现低至一百五十毫秒, 与此前 linux 系统测试数据接近。该方案最高可支持十二路摄像头高清输入,得益于 r k 三五七六高算力处理器提供了强大图像、视频处理性能, 并支持开源鸿蒙 linux、 安卓以及 r t linux 工业实时性等多操作系统。 a h d 多路高清输入广泛应用于机器人、车载物联、新零售智能终端。 关注触觉智能,获取详细方案,丰富资料与技术支持,助您项目快速落地。


大家好,欢迎大家观看讯媒电子威尼斯的视频。在编写出膜芯片 f t 五叉零六驱动程序的时候,我们可以从 iphonec client 结构体中拿到 iphonec client 的 地址。 在 iphonec client 结构体里,除了有 iphonec 外设的地址,是不是还有其他的硬件信息呢?比如中断号是多少?这个 iphonec 外设是挂载到了哪个 iphonec 控制器上? 在编写触摸芯片 f t 五叉零六这个 iphonec 外设驱动程序的时候,老师是不是说 iphonec 外设驱动程序分成了 iphonec client 和 iphonec driver 两个部分呢? 其中 iphonec client 的 代码是用来描述 iphonec 外设使用的硬件资源的代码。比如这个 iphonec 外设的地址是多少?它挂载到了哪个 iphonec 控制器上? 如果用了设备数, iphonec client 代码就是设备数中的设备节点,如果没有用设备数,我们就可以通过 c 程序实现 iphonec client 的 代码。那 iphonec client 的 代码和这里的 iphonec client 结构体有什么关系呢? 因为通过这个结构体,我们不难发现,这个结构体中的各个成员是不是也是描述了 iphonec 外设使用的硬件资源呀?所以这节课我们就一起来探讨一下 iphonec client 这个结构体和我们之前编写的 iphonec client 部分代码有什么关系? 同学们直接来看老师的讲义,我们先从没有设备数的时候分析这个问题,再从有设备数的时候分析这个问题,先回顾历史,再展望未来,这样我们可以更容易理解这个知识点。 在没有设备数的时候,我们边写 iphonec client 代码是直接写的 c 程序,但是在 c 程序里,我们是不是没有直接去创建一个 iphonec client 结构体啊?我们没有这样写, 同学们看,是不是没有这样写啊?我们是写了一个 iphonec word infore 结构体, 在 iphone c book 的 引分这个结构体中,我们写了 iphone c 卖社的地址和它的名字。那之前在讲解 iphone c client 代码的时候,老师是不是说这个结构体它是用来描述 iphone c 卖社的硬件资源的结构体呢? 因为在这个结构体里,它是不是就有 iphone 外设的地址中断和它的节点这些信息啊?那同学们看这个 iphone 壳的一个 for 结构体,它和这个 iphonec client 结构体是不是长得很像呢?我们来对比一下。 在 iphonec client 这个结构体中,有 flags, a, d, d, r, name, i r q 这四个成员。在 iphonec bird in for 这个结构体中,有 type flags a, d, d, r, i q 这四个成员。这四个成员这两个结构体是不是一样的呢? 在 iphonec client 这个结构体中,有 device 这个成员。在 iphonec birding 这个结构体中有这三个成员。这三个成员实际上都在 device 这个结构体里面。我们可以看一下,我们跳转到 device 这个结构体中, 在 device 这个结构体里,是不是就有这三个成员呀? 所以 iphone c client 和 iphone c 苹果零 four 这两个结构体百分之九十都是一样的。 只不过 iphone c 苹果零 four 这个结构体中没有 iphone c adapter、 iphone c driver 和它没有这三个成员。其中 iphone c adapter 它是不是描述我们这个 iphone c 外设是挂载到了哪个 iphone c 控制器上呢? 那这个成员是不是也是非常重要的成员呀,但是我们在编写 iphonec client 代码的时候,我们是用 iphonec word 这个结构体描述的 iphonec 外设的硬件信息,但是这个结构体中没有 iphonec adopt 这个成员,那是不是就是说我们没有办法通过这个结构体来描述我们这个 iphonec 外设是挂载到了哪个 iphonec 控制器上了? 但是同学们说这个星期重不重要呢?它是非常重要的,比如我们在使用设备数编写 iphonec client 代码的时候,我们 iphonec 外设是挂载到了 iphonec 二上,那我们是不是就要在 iphonec 二这个控制器下来编写 iphonec 外设的自觉点? 但是在没有设备数之前,我们没有办法直接描述我们 iphone c 外设是挂在了哪个 iphone c 控制器上。那 linux 是 怎么解决这个问题的呢? 之前我们是使用 c 程序编写的 iphonec client 代码,但是在没有设备数的时候,这些代码呢?我们是要把它放到平台文件当中,并不是自己去单独写一个 c 文件。现在我们使用的 r k 三五六八开发版,它使用的是设备数,就没有平台文件了。 呃,平台文件,同学们如果不理解,呃,你把它理解成是 plant from 总线的 device 部分就可以了。那设备数是不是替代了平台总线的 device 部分呀?那也就是说设备数替代了这个平台文件啊?这个部分。 那对于这个问题,我们在三五六八上是不是就没有办法讨论了呢?所以我们得换一个内核原码,这里老师使用的是我们四四幺二叉板上的三点零的内核原码,这个原码呢,老师也会把它放到我们的课程当中, 老师现在使用 vs code 打开了这个内核原码,然后我们找到平台文件,我们可以搜一下 这个呢就是平台文件,也就是这个 c 文件,它是在这个路径下, 我们搜一下关键字, iphonec registerbirdinput。 同学们看,在这个平台文件当中,我们是不是调用了这个 api 函数,注册了一个 iphonecbirdinput 呀?所以接下来我们看一下这个函数, 这个函数呢是在这个 c 文件当中,给同学们看一下这个 c 文件所在的路径, 在 linux 中对它也做了详细的注示,它就是用来描述这个 iphonec 外设的。 这个函数一共有三个参数,第一个参数是总线编号,什么是总线编号呢?比如 iphonec 一, iphone c 一 中的一就是总线编号,那如果你这个 iphone c 外设是挂在到了 iphone c 一 上,那这个总线编号你就要写一, 第二个参数是 iphone c 倍的音速,第三个参数是有多少个 iphone c 倍的音速。所以在平台文件中,我们写好了一个 iphone c 倍的音速结构体以后,比如这样, 然后就调用 iphonec register board input 这个 a t i 函数,注册一个 iphonec board input。 你 比如说这里的零是不是就是说它挂载到了 iphonec 零上了?注意啊,这个零它指的是总线编号,它指的不是 iphonec adapter, 也就是 iphonec 控制器。 那这个 api 函数做了哪些事情了?这个 api 函数主要做的事情就是把总线编号和 iphonec word 因子给封装成了 dv 因子,这个结构体 核心代码就是这个负循环,然后将它挂载到了这个列表上。那是不是说这个函数里面 也没有寻找 iphone c adopter 的 操作,也没有创建 iphone c client 结构体的操作呀?它只不过把这个总线编号和这个 iphone c board 引号给封装成了这个结构体,并用这个链表进行了管理。 分析到这,我们的思路是不是就断了呢?因为在 iphone c register board 引号这个函数中,没有再调用其他函数了。 不过我们想一个问题, iphone c 外设要挂载到 iphone c 控制器上? iphone c 外设挂载到 iphone c 控制器上的前提是不是得先有 iphone c 控制器呢?举个例子,我现在要挂衣服,我是不是得先有衣架才能挂衣服呢?如果没有衣架,你这个衣服挂哪了? 所以接下来我们的分析思路是不是就要看 iphonec 控制器的驱动程序呢?四四幺二处理器的 iphonec 控制器的驱动程序是这个 c 文件,我给同学们看一下路径。 那什么时候可以说明这个 iphonec 控制器它已经工作起来了呢?是不是 执行完 power 函数,它就工作起来了呀?那工作起来了是不是就是说它有 iphonec 控制器了呀?有 iphonec 控制器了,我这个 iphonec 外设是不是就可以往上挂了?也就是说现在有衣架了,我就可以往衣架上挂衣服了。所以接下来我们就分析这个 power 函数。 那我们分析这个 power 函数是不是也得往后看呀?因为这个 power 函数执行完的时候,这个 iphonec 控制器它才工作起来了呀。所以我们前面的就不用看了,我们直接往后找。 在 return 之前,它调用了这个函数,我们跳转到定义 这里,没有跳转过去,我们搜一下,我们进到四四幺二的内核源码目录下,然后进到 driver 目录下,在 driver 目录下,我们搜一下这个函数。 我们搜到了这么多的函数,那哪个才是我们想要的呀?是不是得有 iphone c 关键词的呀?那比如这里,在 iphone c 横杠 c o r e 点 c 当中, 大家看这个写法是不是就是它的原型呀?所以接下来呢,我们得打开这个 c 文件, 在这个函数中,它最后是不是调用了 iphone c register adapter 这个函数呢? 从名字上看,我们可以看出来这个函数它的作用是不是就是注册一个 iphonacadopter 呢?然后在这个函数中,它调用了这个函数。 同学们看这个函数名 iphonac 是 看什么什么翻译过来,是不是就是扫描这个 word in front, 然后传入了 iphonacadopter。 我 们来看一下这个函数, 在这个函数中,它是不是循环遍历了这个列表呀?同学们看循环遍历的这个列表熟不熟悉呢?是不是就是它呀? 然后是不是通过这个总线编号,也就是零一二来确定是哪个 fnc 到 bottom 呢?然后调用了 fnc new device 这个函数。 iphone c new device 这个函数,它的返回值是一个 iphone c client, 它传入的参数是 iphone c adapter、 iphone c bird 音符。然后同学们看这里面的代码,是不是就是通过这个 iphone c bird 音符,却创建了 iphone c client 这个结构体了? 所以这个思路我们是不是就分析清了呀?我们在编写 iphone c client 代码的时候, 我们这里写了一个 iphone c 倍零 four 这个结构体,然后我们在入口函数中,我们调用了这个 iphone c 六底外数,然后在没有设备数的时候,我们这些代码呢,是需要把它写到平台文件当中的,在平台文件当中里,它调用了这个 api 函数, 然后最终在这个 iphonec 控制器的 power 函数里,它是不是调用了这个函数呢?然后接着往下这个去执行,最后呢调用这个 api 函数, 在这个 api 函数中就调用了 iphonec new device 来创建了 iphonec client 这个结构体。 那同学们说这个 iphonec client 结构体,它是不是也是描述 iphonec 外设使用的硬件资源的结构体了?那它里面的成员是不是就是通过这个赋值啊得到的? 那同学们想一个问题, linux 它为啥要这么做呢?我直接在驱动程序中,我去写一个 iphone c client 结构体不好吗?我为啥要经过这么多的步骤,然后呢去创建这个 iphone c client 结构体呢?那其实这个问题呢,就是刚才老师提到的这个问题, 我们的 iphonec 外设要挂载到 iphonec 控制器上,你挂载的前提得是先有 iphonec 控制器,你才能够去挂载这个 iphonec 外设。那用通俗的话讲就是我们晾衣服,你得先有晾衣杆,你才能晾衣服呀,没有晾衣杆的话,你衣服要晾在哪呢? 所以同学们看,在这个 iphonec 控制器的驱动程序当中,是不是它在 power 函数中 去创建的这个 iphone c client 结构体啊?而且还是在最后面,因为 pro 函数执行完了,是不是就说明这个 iphone c 控制器它工作起来了呀,它工作起来了,也就是有这个晾衣杆了,然后此时你再去创建这个 iphone c client 结构体,那是不是你就有地方去挂载了呀?其实 linux 它主要是为了保证 啊这个思路,所以说他才这样去写的这个呢,是在没有设备数的时候,是如何实现这个 iphonec client 结构体的?那通过刚才我们的分析啊,已经知道这个 iphonec client 结构体它也是用来描述硬件资源的,然后这里面的这些成员的纸它也是通过赋值拿到的,所以说 在这个驱动程序当中,我们通过它就可以拿到这个 iphonec 的 外设的地址。 没有设备数的时候, iphone c client 结构体是在哪创建的,以及 iphone c client 结构体的作用我们就讨论完了,老师也会把我们四四幺二的内核源码放到我们的课程当中,同学们如果想分析也可以自己分析一下,如果不想分析,你就听老师的讲解就可以了。

今天给大家讲一下富屏的适配原理,我们以这个长条串口屏为例,通过设置分辨率、刷新率等参数进行适配, 最终实现流畅稳定的显示效果。 最后展示几款迷你安卓尔主板的定制方案,供大家参考。