GPIO是一组可编程控制的引脚,由多个寄存器同时控制。应用程序都能够通过相应的接口使用GPIO。GPIO驱动主要作用就是读取GPIO口的内容,或者设置GPIO口的状态。GPIO与硬件体系密切相关,在Linux内核目录下的相关文件中我们可以发现针对不同硬件芯片的GPIO定义和使用方法,如本书涉及的S5PV210芯片Linux内核中也有相应的驱动程序支持。本章主要讲的就是如何使用Linux内核封装好的GPIO接口函数在驱动开发中需要操作GPIO时候的使用。......
2023-11-19
RTL8019AS的驱动程序包括芯片的初始化程序,接收数据程序和发送数据程序。该控制器收发数据以内部的RAM为核心。RTL8019AS有两块内部RAM,一块16KB的RAM,用来存储转发的数据;另一块为32B的RAM。16KB存储区是分页的,每256个字节称为一页,共有64页,程序设计中使用这块RAM存储接收或是发送数据包。由于RTL8019AS接收或发送是以页为单位的,因此即使某页没有完全填满数据,下一包数据也不能继续使用该页,只能使用新的页。并且数据是按页连续存放的,这16KB的RAM可由用户进行配置,一部分用来存放接收的数据包,一部分用来存储发送的数据包,但是地址不能交错。
用户通过DMA方式访问16KB的RAM,该RAM为双端口RAM。双端口是指由两套总线连接该RAM,控制器通过总线a对内部RAM进行DMA访问。为了区别主机和芯片两种访问,称这种访问为本地DMA访问;而由CPU通过总线b进行的RAM访问称为远程访问。用户不用担心两种访问会有冲突,芯片内部有防止冲突的仲裁机构。并且由于CPU一侧的远程访问操作要比本地DMA访问慢得多,所以不需要等待时序,可以和本地访问同时进行,互不影响。
驱动程序将已经封装好的待发送的数据按照指定的格式写入芯片,并启动发送命令,数据被发送出去。同样芯片接收到物理信号后将其还原成数据,按照一定的格式,存入RAM中并通知主程序,下面详细讲解驱动程序。
1.RTL8019AS的初始化
完成复位之后,要对RTL8019AS的工作参数进行设置,以使网卡开始工作。主要的设置内容为:pstart接收缓冲区的起始地址;pstop接收缓冲区的结束页地址;bnry指向最后一个已经读取的页;curr指向当前的接收结束页地址。在设置寄存器的时候,应先使其在停止模式,然后设置。
2.发送数据程序
作为一个集成的以太网芯片,数据的发送校验,总线数据包的碰撞检测与避免是由芯片自己完成的。先将数据按照图9-13所示的格式放入RAM中,设定发送数据的起始页地址和发送的长度,然后填写发送命令,芯片会自动地将数据转化为物理帧格式在物理信道上传输,同时发送的结果会写入状态寄存器。可以通过查询该寄存器判断数据是否成功发送出去,以便进行后续处理。由于该芯片寄存器分为4页,因此对某一寄存器进行操作的时候,首先要明确寄存器所属的页,并选中该页,然后进行相应的操作。主要操作如下:
1)长度判断。因为以太网报文要求最小字节数为60,所以在发送报文前要判断报文长度是否符合标准。若长度过小则添加字段,不能小于最小长度,而最大报文长度则由上层应用控制。
2)选定发送缓冲区。在初始化的时候,系统定义了两个发送缓冲区,当一个缓冲区正在发送数据的时候,如果还有数据需要发送,可以先把数据转移到第二个发送缓冲区中,这样当第一个发送完毕之后,可以立即发送第二个缓冲区中的数据,提高发送效率。
3)设置发送字节长度。
4)复制数据。将数据复制到RTL8019AS发送缓冲区,即芯片内部RAM中。
5)发送报文。发送报文时先判断上一个数据报文是否发送完毕,若没有发送完毕则等待或重发,否则发送当前报文。
发送数据时的数据填充格式如图9-13所示。
图9-13 发送数据时的数据填充格式
3.接收数据程序
当数据到来的时候,芯片会将物理信号翻译为数据,然后将数据按照图9-14所示的格式放入预先设置的RAM中,主程序通过查询或是接收中断的方式得知有新的数据到来。数据接收到之后,会放到由pstart和pstop两个寄存器所限定的循环列队中,数据的读写受指针curr和bnry的控制,芯片写完接收缓冲区一页,自动的使curr递增;bnry要由用户来操作,每从RAM中取走一页数据,将bnry递减,并写到bnry中。curr和bnry主要用来控制缓冲区中数据的存取,如果curr=bnry+1时,表示没有接收到数据包;当上述条件不成立时,表示接收到新的数据包,然后读取数据包,直到上述条件成立时,表示所有的数据包已经读完,此时停止读取数据包。在初始化的时候使curr=bnry+1。注意,当curr递增到pstop时,将curr置为环形接收区的首页pstart。同样,当bnry加到最后的空页pstop时,同样要手动将bnry变为第一个接收页pstart。这样就可以组成一个循环的数据接收区。接收数据后,在RTL8019AS中数据的存储格式如图9-14所示。
图9-14 接收数据的存储格式
主要操作如下:
1)判断curr=bnry+1是否成立,如果不成立,说明有新的数据到来,否则继续查询。
2)若有报文到达,判断报文是否正确。主要是判断接收到报文后,芯片自动计算的CRC校验是否正确。若没有出错标志,则说明报文接收正确。
3)接收到正确的报文后,读出报文到系统缓冲区,否则丢弃。
4)判断接收的数据是否为ARP报文或IP报文,如果是则置相应的标志,否则丢弃。(www.chuimin.cn)
接收数据包流程如图9-15所示。
图9-15 接收数据包流程图
4.驱动程序头文件driver.h
驱动程序头文件driver.h定义如下:
5.驱动程序
该程序定义全局变量,网络底层驱动程序,校验和计算,对CPU和RTL8019AS初始化。
驱动程序driver.c设计如下:
有关现场总线与工业以太网及其应用技术的文章
GPIO是一组可编程控制的引脚,由多个寄存器同时控制。应用程序都能够通过相应的接口使用GPIO。GPIO驱动主要作用就是读取GPIO口的内容,或者设置GPIO口的状态。GPIO与硬件体系密切相关,在Linux内核目录下的相关文件中我们可以发现针对不同硬件芯片的GPIO定义和使用方法,如本书涉及的S5PV210芯片Linux内核中也有相应的驱动程序支持。本章主要讲的就是如何使用Linux内核封装好的GPIO接口函数在驱动开发中需要操作GPIO时候的使用。......
2023-11-19
教师命题时,可以通过任务驱动,让学生呈现出问题解决过程中的阶段学习成果。例如,下面这组试题就是以任务驱动呈现了学生的典型学习成果。这组题目以完成“开篇陈词”为项目,以达成此项目每一步骤为具体任务。学生完成开篇陈词的撰写,自己首先要有明确的观点,并且用相关证据阐释自己的观点。第1题至第4题属于解决问题的“过程”,第5题呈现的是解决问题的“结果”。......
2023-08-06
通常鼠标或热键等的动作称之为事件,而由鼠标或热键等引发的一连串程序的动作,称之为事件驱动。而对事件进行处理的程序或函数,称之为事件处理程序。事件通常与函数配合使用,当事件发生时函数才会执行。将函数名赋值给事件名,一旦发生了该事件则会调用相关的函数(程序)来处理发生的事件,如:表示一旦该标记对象上发生了鼠标双击事件,则执行JS函数Select()。图3-17 事件驱动及事件处理E_js_3.htm:......
2023-11-19
在《别惊飞了鸟》中,几个乡村小人物间的插科打诨,交织着他们多年以来的爱恨情仇,道出了底层社会粗鄙的处世哲学,在这些乡村底层小人物的身上,寄托了作者对自古以来“哀其不幸,怒其不争”的奴性人格深深的批判和悲悯。......
2023-12-02
USB的设计为非对称式的,它是主从式总线,任何USB事务都是由主机引发的。USB总线拓扑如图7-12所示。图7-12引自《USB2.0规范》。USB总线已经成为使用最广泛的设备连接标准。每个USB设备至少有两个端点/管道,分别是进和出两个方向,编号为0,用于控制总线上的设备。总体上来说,系统对USB总线驱动的需求就是要能按规范实现总线的各种功能,并且满足总线的各种无关性的需求。......
2023-11-22
鉴于黏结底层的重要性,在进行涂层设计时,应综合考虑基材的热物理特性和具体工况条件进行谨慎选择。当基材为铜及铜合金时,应优先选用铝青铜作黏结底层。对于在腐蚀介质中工作的涂层,进行涂层设计时要特别注意,黏结底层及工作层均应首先具备抵抗工作介质腐蚀的能力。......
2023-06-18
蔡翔1苏州河由西向东,蜿蜿蜒蜒地流过这个城市。我的祖先已经悄然远去,但是苏州河的北面却依然被这个城市拒绝。而在更多的地方,在苏州河的北面,棚户区仍然象征着我的底层,我常常在那里拾回我童年的记忆。然而在那个时代,贫穷并未导致我的底层的愤怒,相反,他们对国家表示出一种极大的热情和忠诚。贫穷并未导致道德的沦丧,相反,我的底层牢牢恪守着它的道德信条,他们对贪污和盗窃表示出一种极大的憎恶和轻蔑。......
2023-07-15
表4-20 通信距离与通信波特率关系表(续)CAN接收子程序1)程序流程图。图4-35 CAN接收子程序流程图2)程序清单。图4-36 CAN发送子程序流程图2.PeliCAN程序设计初始化子程序程序清单如下:入口条件:波特率控制字存入NBTR0和NBTR1中。......
2023-11-22
相关推荐