子模块

 

Linux系统提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动,下面是Input子系统架构:

输入子系统由驱动层(Drivers),输入子系统核心层( Input Core )和事件处理层(Event Handler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下等都是通过 Driver -> InputCore -> Eventhandler -> userspace 的顺序到达用户空间传给应用程序。下面介绍各部分的功能:

(1)驱动层功能:负责和底层的硬件设备打交道,将底层硬件设备对用户输入的响应转换为标准的输入事件以后再向上发送给输入子系统核心层(Input Core)。

(2)Input系统核心层:Input Core即Input Layer,由driver/input/input.c及相关头文件实现,它对下提供了设备驱动层的接口,对上提供了事件处理层(Event Handler)的编程接口。

(3)事件处理层将硬件设备上报的事件分发到用户空间和内核。

 

 

 

Linux网络体系结构由以下五个部分组成 1)系统调用接口 2)协议无关几口 3)网络协议 4)设备无关接口 5 设备驱动程序。下面分别简述五个部分:

    1)系统调用接口

    系统调用接口是用户空间的应用程序正常访问内核的唯一合法途径(终端和陷入也可访问内核)。如:

    asmlingkage long sys_getpid(void)

    {

    return current->pid;

    }

    系统调用一般由sys开头 ,前面的修饰符是asmlingkage,表示函数由堆栈获得参数。

    2)协议无关接口

    协议无关接口是由socket来实现的。它提供了一组通用函数来支持各种不同协议。

    通过网络栈进行的通信都需要对 socket 进行操作。Linux 中的 socket 结构是 struct sock ,这个结构是在 linux/include/net/sock.h 中定义的。这个巨大的结构中包含了特定 socket 所需要的所有状态信息,其中包括 socket 所使用的特定协议和在 socket 上可以执行的一些操作。

    网络子系统可以通过一个定义了自己功能的特殊结构来了解可用协议。每个协议都维护了一个名为 proto 的结构(可以在 linux/include/net/sock.h 中找到)。这个结构定义了可以在从 socket 层到传输层中执行特定的 socket 操作

    3)网络协议

    Linux支持多种网络协议,可以在<linux/socket.h>中查到所支持的网络协议:

    #define AF_UNIX        1    /* Unix domain sockets         */

    #define AF_LOCAL    1    /* POSIX name for AF_UNIX    */

    #define AF_INET        2    /* Internet IP Protocol     */

    #define AF_AX25        3    /* Amateur Radio AX.25         */

    #define AF_IPX        4    /* Novell IPX

    … …

    其中每一个所支持的协议对应net_family[]数组中的一项,net_family[]是结构体指针数组,其中的每一项都是一个结构体指针,指向一个net_proto_family 结构

    struct net_proto_family {

    int family;

    int (*create) (struct socket * sock, int protocol);

    short authentication;

    short encryption;

    short encrypt_net;

    struct module *owner;

    };这个结构体中注册了关于协议的信息。

    4)设备无关接口

    设备无关接口是由net_device实现的。任何设备和上层通信都是通过net_device设备无关接口。

    它将协议与具有很多各种不同功能的硬件设备连接在一起。这一层提供了一组通用函数供底层网络设备驱动程序使用,让它们可以对高层协议栈进行操作。

    首先,设备驱动程序可能会通过调用 register_netdevice 或 unregister_netdevice 在内核中进行注册或注销。调用者首先填写 net_device 结构,然后传递这个结构进行注册。内核调用它的 init 函数(如果定义了这种函数),然后执行一组健全性检查,并创建一个 sysfs 条目,然后将新设备添加到设备列表中(内核中的活动设备链表)。在 linux/include/linux/netdevice.h 中可以找到这个 net_device 结构。这些函数都是在 linux/net/core/dev.c 中实现的。

    要从协议层向设备中发送 sk_buff ,就需要使用 dev_queue_xmit 函数。这个函数可以对 sk_buff 进行排队,从而由底层设备驱动程序进行最终传输(使用 sk_buff 中引用的 net_device 或 sk_buff->dev 所定义的网络设备)。dev 结构中包含了一个名为 hard_start_xmit 的方法,其中保存有发起 sk_buff 传输所使用的驱动程序函数。

    报文的接收通常是使用 netif_rx 执行的。当底层设备驱动程序接收一个报文(包含在所分配的 sk_buff 中)时,就会通过调用 netif_rx 将 sk_buff 上传至网络层。然后,这个函数通过 netif_rx_schedule 将 sk_buff 在上层协议队列中进行排队,供以后进行处理。可以在 linux/net/core/dev.c 中找到 dev_queue_xmit 和 netif_rx 函数。

    5)设备驱动程序

    网络栈底部是负责管理物理网络设备的设备驱动程序。例如,包串口使用的 SLIP 驱动程序以及以太网设备使用的以太网驱动程序都是这一层的设备。

    在进行初始化时,设备驱动程序会分配一个 net_device 结构,然后使用必须的程序对其进行初始化。这些程序中有一个是 dev->hard_start_xmit ,它定义了上层应该如何对 sk_buff 排队进行传输。这个程序的参数为 sk_buff 。这个函数的操作取决于底层硬件,但是通常 sk_buff 所描述的报文都会被移动到硬件环或队列中。就像是设备无关层中所描述的一样,对于 NAPI 兼容的网络驱动程序来说,帧的接收使用了 netif_rx 和 netif_receive_skb 接口。NAPI 驱动程序会对底层硬件的能力进行一些限制。

(1) Wifi卡的常用接口有:CF 接口 USB接口 SDIO接口 SPI接口 PCMCIA接口
(2) SD卡与SDIO卡的异同
1.SD卡使用的是SD卡协议,而SDIO卡使用的是SDIO协议;协议不一样,初始化/读写方式都不一样
 
(3)
•SDIO协议
–相对于SD协议,SDIO协议特有的命令有:cmd5,cmd52,cmd53
–cmd5命令相当于SD卡协议中的acmd41,用于匹配SDIO卡的电压
–对于SDIO卡中的单个寄存器的读写一般都使用cmd52命令,而对于多字节数据的读写则用cmd53命令。
–cmd53分字节和块传输模式
对于字节传输模式相当于SD协议的单块读写(cmd17,cmd24)
对于块传输模式相当于SD协议的块读写(cmd18,cmd25)
 
(4)
•Cmd53
–对于字节传输模式,它可以是1~512之间的任意长度的传输,而不是固定长度
–对于块传输模式,首先它的块长度可以人为设定,但不能超过规定的最大块长度
–相对于SD卡中的块传输模式,在最后一个块传输末尾,是不需要发送块停止命令的(cmd12)
 --每个SDIO卡都由1~7个function (optional)和一个memory function(mandatory)组成
•什么是function ?
–所谓function,就是一个I/O设备,它实质就是一些寄存器的集合
 
(5) SDIO卡里function的组织分布
•CIA就是function0,也就是memory function,它每个SDIO卡所必须具有的,它里面包含了如下一些重要信息:
–SDIO协议的版本号,BUS MOD,块大小等。这些信息有些是只读的,有些是可读可写的
•Function1~7是可选的,根据具体的应用的不同,所包含的function数目也不一样,譬如我门使用的marvell的8686芯片,它就只有function0和function1
 
(6)sdio 1~4bit mode
PIN
SDIO 4-BIT MODE
SDIO 1-BIT MODE
1
CD/DAT3
Data line 3
N/C
Not used
2
CMD
Command line
CMD
Command line
3
VSS1
Ground
VSS1
Ground
4
VDD
Supply voltage
VDD
Supply voltage
5
CLK
Clock
CLK
Clock
6
VSS2
Ground
VSS2
Ground
7
DAT[0]
Data line 0
DATA
Data line
8
DAT[1]
Data line1 or INT line
IRQ
Interruption
9
DAT[2]
Data line2 or read wait
RW
Read wait
1.SDIO mode 同样也有1bit和4bit 总线模式
2.SD与SDIO卡的引脚的一个最大的区别是:SDIO有个中断引脚DAT[1],在4bit模式下,DAT[1]既做数据线,又做中断线,因此是分时复用的,在总线发送命令期间,DAT[1]用作中断线。
 
(7)SD
 
PIN
SD MODE
1
Name
Type
Description
2
CD/DATA3
I/O/PP
Card detect/data line3
3
CMD
Pp
Command/response
4
Vss1
S
Ground
5
VDD
S
Supply voltage
6
Vss2
S
Ground
7
DAT0
I/O/PP
Data line0
8
DAT1
I/O/PP
Data line1
9
DAT2
I/O/PP
Data line2
•当HOST同时连接多个卡时:
–时钟,电源,地线可以为每个卡公共
–但每个卡都有自己单独的数据和命令总线,避免干扰
–在卡的初始化过程中,命令是单独发到每个卡的,允许驱动来检测每个卡槽的卡是否存在,并且分配相应的逻辑地址给每个卡槽。
–HOST与每个卡槽的卡的数据传输都是单独进行的,因为每个卡槽都有自己的数据总线
–在卡的初始化完成后,命令可以同时发送到每个卡槽,因为此时命令中已经包含了卡的逻辑地址(在卡的分别初始化时分配的)
 
(8)SD卡与SDIO卡的检测判别
–上电,发送CMD5命令,如果有响应,并且响应中的MP位为0,说明对应卡槽中的卡为SDIO卡,进而开始SDIO卡的初始化流程
–如果发送CMD5命令没有响应,则说明对应卡槽的卡为SD或MMC卡,进而开始SD/MMC卡的初始化流程
–如果发送CMD5命令,有响应,且响应中的MP位为1,说明这个卡不但是SDIO卡,同时也时SD卡,也就是所谓的combo卡,则进行combo卡的初始化流程
 
 
 MMC 子系统范围三个部分:

HOST 部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的。

CORE 部分: 这是整个MMC 的核心存,这部分完成了不同协议和规范的实现,并为HOST 层的驱动提供了接口函数。

CARD 部分:因为这些记忆卡都是块设备,当然需要提供块设备的驱动程序,这部分就是实现了将你的SD 卡如何实现为块设备的。

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值