Transcript IISR

Windows CE, Installable ISR
[email protected]
rechoco.egloos.com
GIISR



MS에서 제공하는 Generic Intallable ISR
IRQ <-> interrupt id 간의 Statice mapping을 사용할 경우 사용할 인터럽트가 추
가되거나 변경될 시 BSP의 여러가지 부분에 대한 수정을 요구하게 됨
Installable ISR을 사용할 경우 커널의 컴파일 없이 드라이버 레벨에서 interrupt
mapping을 생성하게 되므로 커널의 변경없이 interrupt를 추가할 수 있음

IISR은 특정 IRQ와 동적으로 할당받은 interrupt id를 커널에 등록하는 방법

참고사이트
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 핸들
//irq to logical id 변환 옵션 저장소
GIISR_INFO Info;
DWORD irqnum;
DWORD SystemLogicalID;
// hardware IRQ
// 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;

return SystemLogicalID
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
Interrupt Occured
N
CheckPort
Y
Portvalue = GIISR_INFO.PortAddr
OEMInterruptHandler
Mask = GIISR_INFO.Mask
Logical ID = NkCallIntChain
UseMaskReg
N
Y
Return SysIntrID
Mask = GIISR_INFO. MaskAddr
N
Portvalue&Mask
Y
*NkCallIntChain
◦
◦
◦
내부적으로 ISR핸들러를 호출함
SYSINTR_CHAIN이 반환될 경우, 등록된 다음 ISR핸들러를 호출
Valid한 Logical ID가 반환될 경우, ISR호출 종료후 리턴