驱动设计流程

    MiniDriver上层还有一个叫做ClassDriver的驱动。MiniDrive通过DriverEntity向ClassDriver注册它自己。这个过程是通过向ClassDriver传递HW_INITIALIZATION_DATA结构实现的。MiniDriver中的DriverEntity例程就是填写这个结构体,然后通过StreamClassRegisterAdapter这个函数将结构体传递给ClassDriver. HW_INITIALIZATION_DATA中有四个参数HwInterrupt, HwReceivePacket, HwCancelPacket,HwTimeOutPacket分别指向一个回调函数,以后ClassDrive通过这几个参数所指定的回调函数向MiniDriver发送消息,控制MiniDriver工作。
    其中HwInterrupt, HwCancelPacket,HwTimeOutPacket分别针对硬件中断,取消包操作,包操作超时所做的特殊处理。而HwReceivePacket则是ClassDriver向MiniDriver发送操作指令的主要通道。ClassDriver会将一个结构体_HW_STREAM_REQUEST_BLOCK(SRB)做为参数发给MiniDriver.这个结构中的Command成员定义了具体的操作类型。如SRB_INITIALIZE_DEVICE,SRB_GET_STREAM_INFO等。HwReceivePacket所指定的回调函数通过判断Command成员的类型再去实现具体的操作。操作完成后,MiniDriver先设置当前SRB中表示请求状态的状态域,再通过StreamClassDeviceNotification告诉ClassDriver已经完成了这个操作,可以发送下一个SRB了。所有在HwReceivePacket中的操作都属于设备操作。
    驱动的第一步操作就是初始化,即ClassDriver通过HwReceivePacket所指定的回调函数发送的第一个命令是SRB_INITIALIZE_DEVICE。驱动程序在响应这个消息时,先通过ExAllocatePool分配必要的内存空间,然后由UsbBuildGetDescriptorRequest来创建一个新的URB。另一方面由IoBuildDeviceIoControlRequest 创建一个IPR中,然后再通过IoGetNextIrpStackLocation处理这个IRP。然后将这个URB封装到这个IRP的Parameters.Others.Argument1参数中。最后通过IoCallDriver将这个IRP发送到下一级的驱动中。在响应SRB_INITIALIZE_DEVICE的过程中,总共创建了三个URB,对应的也发送了三个IPR到下一层驱动。在响应这个消息时,还可以对硬件配置做一些初始化。
完成上一个消息响应后,ClassDriver发送包含有SRB_GET_STREAM_INFO的SRB。MiniDriver将所支持的流的信息及它的每个流的回调函数提供给ClassDriver。(这里的回调函数属于数据操作,要用StreamClassStreamNotification来通知ClassDriver已经完成了这个操作。)
    然后ClassDriver再发送SRB_INITIALIZATION_COMPLETE请求,MiniDriver处理完这个请求后,初始化才算真正的完成。
初始化完成后,ClassDriver会发送SRB_OPEN_STREAM消息,MiniDriver据此执行必要的硬件动做,打开相应的流。主要是用已知流的信息初始化当前SRB中的StreamObject结构。然后返回给ClassDriver。
    不再使用这个流时,ClassDriver发送SRB_CLOSE_STREAM给MiniDriver,MiniDriver调用VideoQueueCancelAllSRBs来取消所有的SRB包,并调用ExFreePool释放空间,最后将当前流指针设为空,即完成关闭流的操作。
    ClassDriver发送SRB_GET_DEVICE_PROPERTY与SRB_SET_DEVICE_PROPERTY来实时的设置与得到当前设备的属性。在这一部分,MiniDriver先调用IsEqualGUID来判断是否是所要修改或得到的参数,然后再做具体的设置操作。
另外还有一个命令SRB_GET_DATA_INTERSECTION,还不很清楚
以上所述的都是在HwReceivePacket所指定的回调函数中实现的。它们都要通过StreamClassDeviceNotification来回馈给ClassDriver。另外还有两个回调函数是与数据流操作相关的,这两个函数并不在DriverEntity中声名,而是在响应SRB_OPEN_STREAM消息时向ClassDriver作出定义。这两个函数分别是由HW_STREAM_OBJECT中的参数所指定的成员:VideoReceiveDataPacket
VideoReceiveCtrlPacket
VideoReceiveDataPacket先判断SRB中的Command指令,如果是SRB_READ_DATA,就将SRB送入PHW_DEVICE_EXTENSION-> pStrmEx-> DataList中,并且计数器加一。
VideoReceiveCtrlPacket则接收SRB中的其它一些消息:
SRB_SET_STREAM_STATE
这个消息决定打开视频流还是关闭视频流。这取决于Srb->CommandData.StreamState
SRB_GET_STREAM_STATE
将当前流的状态送入SRB中的相关参数中。如下:
    pSrb->CommandData.StreamState = pStrmEx->KSState;
    pSrb->ActualBytesTransferred  = sizeof(KSSTATE);
SRB_PROPOSE_DATA_FORMAT
SRB_SET_DATA_FORMAT
SRB_GET_STREAM_PROPERTY
以上这些消息都由ClassDriver调用VideoReceiveCtrlPacket发送给MiniDriver。最后再通过StreamClassStreamNotification回复给ClassDriver.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 中,GPIO(General Purpose Input/Output)驱动程序的设计流程如下: 1. 确定 GPIO 引脚:首先,确定要使用的 GPIO 引脚,这取决于硬件平台和需求。每个 GPIO 引脚都有一个唯一的标识符,例如 GPIO1_IO23。 2. 确定 GPIO 功能:确定 GPIO 引脚的功能,例如输入(Input)或输出(Output)。输入模式用于读取外部设备的状态,输出模式用于控制外部设备。 3. 定义 GPIO 设备:在 Android 的设备树(Device Tree)中,定义 GPIO 设备节点。这包括引脚号、功能、中断等属性。 4. 注册 GPIO 设备:在设备树中注册 GPIO 设备节点,以便内核可以识别和管理这些设备。 5. 配置 GPIO:在驱动程序中,配置 GPIO 的功能和属性。这包括设置引脚的输入/输出模式、中断触发方式、电平状态等。 6. 控制 GPIO:通过读取或写入 GPIO 寄存器来控制 GPIO 引脚。对于输出模式,可以设置引脚的电平状态;对于输入模式,可以读取引脚的电平状态。 7. 处理中断:如果配置了中断触发方式,并且有外部设备触发了相应的中断,驱动程序需要适当地处理中断事件。 8. 销毁 GPIO 设备:在驱动程序退出或设备不再需要时,销毁 GPIO 设备并释放相关资源。 需要注意的是,GPIO 驱动程序的具体实现可能会有所不同,取决于硬件平台和驱动程序的要求。开发者可以参考硬件供应商提供的文档和 Android 官方文档来了解更详细的 GPIO 驱动程序设计流程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值