80 likes | 231 Views
Windows CE, Installable ISR. alphabet@hotmail.co.kr rechoco.egloos.com. GIISR. MS 에서 제공하는 Generic Intallable ISR IRQ <-> interrupt id 간의 Statice mapping 을 사용할 경우 사용할 인터럽트가 추가되거나 변경될 시 BSP 의 여러가지 부분에 대한 수정을 요구하게 됨
E N D
Windows CE, Installable ISR alphabet@hotmail.co.kr rechoco.egloos.com
GIISR • MS에서 제공하는 Generic Intallable ISR • IRQ <-> interrupt id 간의 Statice mapping을 사용할 경우 사용할 인터럽트가 추가되거나 변경될 시 BSP의 여러가지 부분에 대한 수정을 요구하게 됨 • Installable ISR을 사용할 경우 커널의 컴파일 없이 드라이버 레벨에서 interrupt mapping을 생성하게 되므로 커널의 변경없이 interrupt를 추가할 수 있음 • IISR은 특정 IRQ와 동적으로 할당받은 interruptid를 커널에 등록하는 방법 • 참고사이트 http://msdn.microsoft.com/en-us/library/ms892237.aspx
Sequence • System Logical ID 동적할당(KernelIoControl) • IISR.DLL 등록 (LoadIntChainHandler) • 응답조건 설정 • 인터럽트 분기방식에 따라 처리해주어야 함 • GIISR_INFO page 참조 • 응답조건 등록(KernelLibIoControl)
Sample Code HANDLE m_hIsrHandler; //giisr 핸들 GIISR_INFO Info; //irq to logical id 변환 옵션 저장소 DWORD irqnum; // hardware IRQ DWORD SystemLogicalID; // logical id //Logical ID 동적 할당 KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, & irqnum, sizeof(UINT32), & SystemLogicalID, sizeof(UINT32), NULL); //IISR 핸들러가 들어있는 dll을 커널에 등록 m_hIsrHandler = LoadIntChainHandler(“tcc_giisr.dll”, "ISRHandler", irqnum); //변환옵션 설정 - X1 value & X2 가 true일 경우 Logical ID를 리턴 memset(&Info, 0, sizeof(GIISR_INFO)); Info.CheckPort = TRUE; Info.PortIsIO = FALSE; // TRUE only used for X86 Info.SysIntr = SystemLogicalID; Info.UseMaskReg = FALSE; Info.MaskAddr = 0; // (Optional 설정) info.PortAddr = X1; // 인터럽트 발생시 set 되는 레지스터의 주소 Info.Mask = X2;// 인터럽트 발생시 set 되는 비트위치 Info.PortSize = sizeof(DWORD);// X1의 레지스터 크기
Sample Code (cont) //변환 옵션 등록 KernelLibIoControl(m_hIsrHandler, IOCTL_GIISR_INFO, &Info, sizeof(GIISR_INFO), NULL, 0, 0); //인터럽트 사용 InterruptInitialize(SystemLogicalID, relative event); // 인터럽트 해제 InterruptDisable( SystemLogicalID); FreeIntChainHandler(m_hIsrHandler); KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &SystemLogicalID, sizeof(UINT32), NULL, NULL, NULL);
GIISR_INFO 설정(3종류) • GIISR_INFO Info; • memset(&Info, 0, sizeof(GIISR_INFO)); • Info.SysIntr = SystemLogicalID; • Info.PortIsIO = FALSE; • Case 1: irq를 공유하지 않는 경우 • Info.CheckPort = FALSE; • returnSystemLogicalID • Case 2: irq를 공유하며 Mask 값이 고정일 경우 • Info.CheckPort = TRUE; • Info.PortSize = sizeof(DWORD); • Info.PortAddr =virtual mapped address; • Info.Mask = MASK; • Info.UseMaskReg = FALSE; • Info.MaskAddr = 0; return Port Value & MASK ? SystemLogicalID:SYSINTR_CHAIN • Case 3: irq를 공유하며 MASK값을 특정레지스터에서 결정할 경우 • Info.CheckPort = TRUE; • Info.PortSize = sizeof(DWORD); • Info.PortAddr =virtual mapped address1; • Info.UseMaskReg = TRUE; • Info.MaskAddr = virtual mapped address; return Port Value & MaskValue ? SystemLogicalID:SYSINTR_CHAIN
GIISR의 동작 ISRHandler CheckPort *NkCallIntChain • 내부적으로 ISR핸들러를 호출함 • SYSINTR_CHAIN이 반환될 경우, 등록된 다음 ISR핸들러를 호출 • Valid한 Logical ID가 반환될 경우, ISR호출 종료후 리턴 Interrupt Occured N Y Portvalue = GIISR_INFO.PortAddr Mask = GIISR_INFO.Mask OEMInterruptHandler Logical ID = NkCallIntChain Return SysIntrID GIISR_INFO.SysIntrID UseMaskReg N Y Mask = GIISR_INFO. MaskAddr SYSINTR_CHAIN GIISR_INFO.SysIntrID Portvalue&Mask N Y