1 / 7

Windows CE, Installable ISR

Windows CE, Installable ISR. alphabet@hotmail.co.kr rechoco.egloos.com. GIISR. MS 에서 제공하는 Generic Intallable ISR IRQ <-> interrupt id 간의 Statice mapping 을 사용할 경우 사용할 인터럽트가 추가되거나 변경될 시 BSP 의 여러가지 부분에 대한 수정을 요구하게 됨

trynt
Download Presentation

Windows CE, Installable ISR

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Windows CE, Installable ISR alphabet@hotmail.co.kr rechoco.egloos.com

  2. 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

  3. Sequence • System Logical ID 동적할당(KernelIoControl) • IISR.DLL 등록 (LoadIntChainHandler) • 응답조건 설정 • 인터럽트 분기방식에 따라 처리해주어야 함 • GIISR_INFO page 참조 • 응답조건 등록(KernelLibIoControl)

  4. 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의 레지스터 크기

  5. 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);

  6. 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

  7. 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

More Related