驱动基础知识-怎么访问io,中断,产生线程,事件

本文探讨了如何在驱动程序中访问寄存器并实现中断事件的绑定,包括寄存器地址的确定、内存分配、中断线程创建、事件与中断的关联以及按键按下事件的检测与通知。


 

1:驱动怎么访问寄存器.,其中IOP_BASE等于0xB1600000  ,为什么是这个值,正在查  ,同样的方法访问中断寄存器#define INT_BASE      0xB0A00000,

 

 v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);


  if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE), sizeof(S3C2410X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) 


2:驱动怎么使用线程 ,创建这个线程后, EINTKey_IntrThread就自动运行了

	gEINTIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) EINTKey_IntrThread, 0, 0, &IDThread);


3:事件和中断 绑定, , 事件有2种触发,一种通过中断自动触发,一种是通过set手动触发,

 

#define IRQ_EINT4           32

//通过硬件中断号申请系统中断:g_EINTIrq是要申请的中断原始偏移,这里值为IRQ_EINT4 ,g_EINTSysIntr为申请的系统中断

    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_EINTIrq, sizeof(UINT32), &g_EINTSysIntr, sizeof(UINT32), NULL))
	// 创建外部中断中断事件 
	gWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);		

	// 初始化外部按键中断: 注册中断事件, 允许外部中断
	if (!(InterruptInitialize(g_EINTSysIntr, gWaitEvent, 0, 0))) 
	{
		RETAILMSG(1, (TEXT("ERROR: EINTKey: InterruptInitialize failed.\r\n")));
		CloseHandle(gWaitEvent);
		return 0;
	}

//怎么判断是否按键按下:在while循环中等待 事件发生了,wait函数就会返回,继续执行

	while (1) 
	{
		ret = WaitForSingleObject(gWaitEvent, INFINITE);
		if ((ret == WAIT_OBJECT_0) && (g_bKillIST == FALSE))

//事件发生了,为了通知另外一个wait函数执行,就要调用调用setEvent函数

				if (Key_IsPushed())		        /* 外部中断按键确实已按下 */
				{  
					SetEvent(gReadKeyEvent[0]);	/* 通知读函数, 外部中断按键按键按下 */		
					RETAILMSG(1, (TEXT("::: The Key1 Pushed. \r\n")));
				} 

和中断绑定的事件发生后,要重新释放

InterruptDone(g_EINTSysIntr);  

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值