GPIO是一组可编程控制的引脚,由多个寄存器同时控制。应用程序都能够通过相应的接口使用GPIO。GPIO驱动主要作用就是读取GPIO口的内容,或者设置GPIO口的状态。GPIO与硬件体系密切相关,在Linux内核目录下的相关文件中我们可以发现针对不同硬件芯片的GPIO定义和使用方法,如本书涉及的S5PV210芯片Linux内核中也有相应的驱动程序支持。本章主要讲的就是如何使用Linux内核封装好的GPIO接口函数在驱动开发中需要操作GPIO时候的使用。......
2025-09-30
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报文,如果是则置相应的标志,否则丢弃。(https://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时候的使用。......
2025-09-30
无论是市场驱动模式,还是政策驱动模式,通常都会伴随着许多社会问题,这些情况的产生,则与“社会共融”的预期背道而驰。特别是在“文化导向”的城市更新演变成为“地产开发导向”的城市更新时,这一趋势尤为严重。此外,大中型创意企业的迁入,一方面造成本地原有中小型企业的外迁,从而降低本地非熟练工人的就业困难;另一方面也可能造成许多小型企业破产,进而造成下层创意工人的失业。......
2025-09-29
蔡翔1苏州河由西向东,蜿蜿蜒蜒地流过这个城市。我的祖先已经悄然远去,但是苏州河的北面却依然被这个城市拒绝。而在更多的地方,在苏州河的北面,棚户区仍然象征着我的底层,我常常在那里拾回我童年的记忆。然而在那个时代,贫穷并未导致我的底层的愤怒,相反,他们对国家表示出一种极大的热情和忠诚。贫穷并未导致道德的沦丧,相反,我的底层牢牢恪守着它的道德信条,他们对贪污和盗窃表示出一种极大的憎恶和轻蔑。......
2025-09-29
问题解决可以定义为成功地搜索一个操作或一系列操作,以便将系统的给定实际状态转移到目标状态。目前最广为接受的问题解决定义是Mayer[9]提出的。换句话说,在任何给定状态下,需要达到目标状态,并且没有可用的常规解决方案时出现问题;将给定状态转换为期望的目标状态的后续过程被定义为问题解决。Mayer把问题解决看作认知过程,并且指出问题解决者没有现成的办法。PISA采用的问题解决定义与Mayer的理解是一致的。......
2025-09-30
鉴于黏结底层的重要性,在进行涂层设计时,应综合考虑基材的热物理特性和具体工况条件进行谨慎选择。当基材为铜及铜合金时,应优先选用铝青铜作黏结底层。对于在腐蚀介质中工作的涂层,进行涂层设计时要特别注意,黏结底层及工作层均应首先具备抵抗工作介质腐蚀的能力。......
2025-09-29
通常鼠标或热键等的动作称之为事件,而由鼠标或热键等引发的一连串程序的动作,称之为事件驱动。而对事件进行处理的程序或函数,称之为事件处理程序。事件通常与函数配合使用,当事件发生时函数才会执行。将函数名赋值给事件名,一旦发生了该事件则会调用相关的函数(程序)来处理发生的事件,如:表示一旦该标记对象上发生了鼠标双击事件,则执行JS函数Select()。图3-17 事件驱动及事件处理E_js_3.htm:......
2025-09-30
端部轮驱动式扶手带驱动装置是采用安装在自动扶梯上端部的带V形槽的驱动轮,配用V形扶手带,类似于三角带的传动方式。端部驱动轮带有V形槽,扶手带上的三角带楔入V形槽而产生摩擦驱动力。端部驱动轮由扶手带驱动链驱动,驱动动力来自主驱动轴。......
2025-09-29
图2.3三个工作室的相位关系α1、α2、α3分别表示三个工作室相应的偏心轴转角,它们之间的关系为图2.3三个工作室的相位关系α1、α2、α3分别表示三个工作室相应的偏心轴转角,它们之间的关系为pg1、pg2、pg3分别表示三个工作室相应的气体压力,并分别作用于各自的转子工作面上,各自的总作用力均通过转子中心。......
2025-09-29
相关推荐