现在有许多高端的ARM芯片,像苹果、三星、华为都采用ARM芯片做为智能手机芯片。
这篇文章介绍基于ARM的WinCE操作系统的驱动的中断分析。WinCE驱动分为两类,这里介绍流驱动,流驱动比较简单。
关于流驱动,下面是一张框图,描叙了流驱动的地位:
我们从右往左看上面的那张图,最右边是应用程序。应该程序通过CreateFile、WriteFile、ReadFile、IoCtrl、CloseFile这几个函数来访问驱动,这和其他的操作系统是一样的,WindowsXP、Linux都是如此。
流驱动是实现了一批函数的库(DLL),包括XXX_Init、XXX_Deinit,上面的框图都列出来了。
在使用驱动之前,需要加载驱动(激活驱动),也就是说让驱动就绪,以便可以让应用程序访问。采用函数ActivateDeviceEx函数来激活,ActivateDeviceEx接收一个注册表路径作为参数,所以,我们需要把驱动信息按照格式写入到注册表内。下面是一个GPIO的注册表示例:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\GPIO]
"Dll" = "s3c6410_gpio.dll"
"Prefix" = "GIO"
"Order" = dword:63
"Index" = dword:1
"FriendlyName" = "GPIO Driver"
在驱动内部,如果使用中断,那么操作步骤如下:
1、驱动初始化时,由物理中断号获取虚拟中断号,调用函数KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR…)
2、驱动初始化时,事件句柄绑定虚拟中断号,函数函数InterruptInitialize,然后创建一个IST线程,并Waiting事件
3、中断处理:硬件中断产生了,在IST线程内的等待事件就会返回,接下来处理中断,最后调用函数InterruptDone,意指中断处理完毕
4、退出驱动前,调用InterruptDisable,禁用当前中断,它与InterruptInitialize相反。
5、退出驱动前,释放虚拟中断号资源KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR...)
如果开发一个以太网驱动,那么怎么知道以太网芯片的硬件中断号是什么?答案是,需要问BSP开发人员或硬件开发人员。它不像Windows驱动,Windows驱动的中断号是由系统通过消息的方式发送给驱动。
像Windows XP操作系统的驱动中断号