도와주세요!!
글 수 15,339
2004.08.06 13:45:37 (*.122.38.35)
6696
정해진 시간 간격으로 Timer Interrupt를 발생하려고 시도를 해보았습니다.
그런데 잘 되지가 않더라구요..
게시판을 뒤지며 해보았지면...ㅜㅡ
저는 EZ-X5보드를 사용하고 있습니다.
우선 정해진 시간간격으로 프린트를 하는 프로그램을 하려고 시도를 하였습니
다.
---- 소스파일 내용중의 일부 ----
void FIFO_GetTime(struct timeval *tv)
{
do_gettimeofday(tv);
}
long FIFO_GetDiffTime(long oldsec, long oldusec, long newsec, long
newusec)
{
long sectime;
long usectime;
if(newsec
return 0;
sectime = newsec - oldsec;
usectime = newusec - oldusec;
if(usectime < 0)
{
sectime--;
usectime = (newusec+1000000L)-oldusec;
}
if(sectime < 0)
return -1;
return sectime*1000000L + usectime;
}
void TimerReload(unsigned long tick)
{
if(0 == tick)
{
TIMER_OFF;
}
else
{
TIMER_ON;
OSMR1 = OSCR+TEN_uSEC_CLK*tick;
}
}
void TimerInterrupt(int irq,void* dev_id,struct pt_regs * regs)
{
TIMER_OFF;
printk("Timer Interrupt
");
TimerReload(TIMER_TICK_uSEC);
}
static int __init gpio_init_module (void)
{
int result;
// 장치를 등록한다.
result = register_chrdev( GPIO_MAJOR, DEVICE_NAME,
&gpio_fops );
if (result < 0)
{
printk(KERN_WARNING "
%s : Can't get Major Number [%
d]
", DEVICE_NAME, GPIO_MAJOR);
return result;
}
printk("
Init module, Succeed. This Device is %s and
Major Number is [%d]
", DEVICE_NAME, GPIO_MAJOR);
// TIMER IRQ를 등록한다.
set_GPIO_IRQ_edge(1<
if(!request_irq
(TIMER_IRQ,TimerInterrupt,SA_INTERRUPT,TIMER_NAME,NULL))
{
enable_irq(TIMER_IRQ);
printk("Interrupt Timer Register OK!
");
}
else
{
printk("Timer can't get assigned IRQ
");
}
GPIO_IO_Init();
TimerReload(TIMER_TICK_uSEC);
return 0; /* 성공 */
}
static void gpio_cleanup_module (void)
{
TIMER_OFF;
disable_irq(TIMER_IRQ);
free_irq(TIMER_IRQ,NULL);
// 모듈을 해제한다..
if ( !unregister_chrdev( GPIO_MAJOR, DEVICE_NAME) )
printk("%s Device Exit Sucess...
", DEVICE_NAME);
else
printk("%s Device Exit Fail...
", DEVICE_NAME);
}
--------------------------------------------------------------------
---- 헤더파일 내용중의 일부 ----
#define TIMER_NAME "MTIMER"
#define TIMER_GPIO_IRQ 1
#define TIMER_IRQ 12
// 게시판을 찾아보니 EZ-X5는 12번을 써야한다고 나와 있어서..
#define TIMER_TICK_uSEC 10
#define ONE_SEC_CLK 3686400
#define TEN_uSEC_CLK ONE_SEC_CLK/100000
#define TIMER_ON OIER |= OIER_E1; OSSR=OSSR_M1
#define TIMER_OFF OIER &= ~OIER_E1; OSSR=OSSR_M1
--------------------------------------------------------------------
위와 같이 모듈을 만들고 insmod를 하면 다음과 같은 결과가 나옵니다.
[root@ez-x5 nfs]$ insmod timer.o
Using timer.o
Warning: loading timer will taint the kernel: no license
Init module, Succeed. This Device is gpio and Major Number is [253]
enable_irq(12) unbalanced from c489d348
Interrupt Timer Register OK!
모듈이 올라가긴 한것 같은데 작동을 하지 않는것 같습니다.
그리고 /proc/interrupts를 확인한 결과 입니다.
[root@ez-x5 nfs]$ cat /proc/interrupts
3: 67663 GPIO 2-80
7: 89 AC97
10: 0 LCD
12: 0 MTIMER
// MTIMER가 전혀 작동을 하지 않고 계속 0을 유지합니다..
13: 2695 serial
18: 0 DMA
19: 599254 timer
31: 2 keyboard
35: 0 SL811
44: 67662 cs89x0
45: 0 mk712_touchscreen
Err: 0
어떻게 해야 할지 감을 못 잡고 있습니다.
부디 많은 조언 부탁드립니다.
그럼 무더운 여름에 건강 조심 하세요.
그런데 잘 되지가 않더라구요..
게시판을 뒤지며 해보았지면...ㅜㅡ
저는 EZ-X5보드를 사용하고 있습니다.
우선 정해진 시간간격으로 프린트를 하는 프로그램을 하려고 시도를 하였습니
다.
---- 소스파일 내용중의 일부 ----
void FIFO_GetTime(struct timeval *tv)
{
do_gettimeofday(tv);
}
long FIFO_GetDiffTime(long oldsec, long oldusec, long newsec, long
newusec)
{
long sectime;
long usectime;
if(newsec
sectime = newsec - oldsec;
usectime = newusec - oldusec;
if(usectime < 0)
{
sectime--;
usectime = (newusec+1000000L)-oldusec;
}
if(sectime < 0)
return -1;
return sectime*1000000L + usectime;
}
void TimerReload(unsigned long tick)
{
if(0 == tick)
{
TIMER_OFF;
}
else
{
TIMER_ON;
OSMR1 = OSCR+TEN_uSEC_CLK*tick;
}
}
void TimerInterrupt(int irq,void* dev_id,struct pt_regs * regs)
{
TIMER_OFF;
printk("Timer Interrupt
");
TimerReload(TIMER_TICK_uSEC);
}
static int __init gpio_init_module (void)
{
int result;
// 장치를 등록한다.
result = register_chrdev( GPIO_MAJOR, DEVICE_NAME,
&gpio_fops );
if (result < 0)
{
printk(KERN_WARNING "
%s : Can't get Major Number [%
d]
", DEVICE_NAME, GPIO_MAJOR);
return result;
}
printk("
Init module, Succeed. This Device is %s and
Major Number is [%d]
", DEVICE_NAME, GPIO_MAJOR);
// TIMER IRQ를 등록한다.
set_GPIO_IRQ_edge(1<
if(!request_irq
(TIMER_IRQ,TimerInterrupt,SA_INTERRUPT,TIMER_NAME,NULL))
{
enable_irq(TIMER_IRQ);
printk("Interrupt Timer Register OK!
");
}
else
{
printk("Timer can't get assigned IRQ
");
}
GPIO_IO_Init();
TimerReload(TIMER_TICK_uSEC);
return 0; /* 성공 */
}
static void gpio_cleanup_module (void)
{
TIMER_OFF;
disable_irq(TIMER_IRQ);
free_irq(TIMER_IRQ,NULL);
// 모듈을 해제한다..
if ( !unregister_chrdev( GPIO_MAJOR, DEVICE_NAME) )
printk("%s Device Exit Sucess...
", DEVICE_NAME);
else
printk("%s Device Exit Fail...
", DEVICE_NAME);
}
--------------------------------------------------------------------
---- 헤더파일 내용중의 일부 ----
#define TIMER_NAME "MTIMER"
#define TIMER_GPIO_IRQ 1
#define TIMER_IRQ 12
// 게시판을 찾아보니 EZ-X5는 12번을 써야한다고 나와 있어서..
#define TIMER_TICK_uSEC 10
#define ONE_SEC_CLK 3686400
#define TEN_uSEC_CLK ONE_SEC_CLK/100000
#define TIMER_ON OIER |= OIER_E1; OSSR=OSSR_M1
#define TIMER_OFF OIER &= ~OIER_E1; OSSR=OSSR_M1
--------------------------------------------------------------------
위와 같이 모듈을 만들고 insmod를 하면 다음과 같은 결과가 나옵니다.
[root@ez-x5 nfs]$ insmod timer.o
Using timer.o
Warning: loading timer will taint the kernel: no license
Init module, Succeed. This Device is gpio and Major Number is [253]
enable_irq(12) unbalanced from c489d348
Interrupt Timer Register OK!
모듈이 올라가긴 한것 같은데 작동을 하지 않는것 같습니다.
그리고 /proc/interrupts를 확인한 결과 입니다.
[root@ez-x5 nfs]$ cat /proc/interrupts
3: 67663 GPIO 2-80
7: 89 AC97
10: 0 LCD
12: 0 MTIMER
// MTIMER가 전혀 작동을 하지 않고 계속 0을 유지합니다..
13: 2695 serial
18: 0 DMA
19: 599254 timer
31: 2 keyboard
35: 0 SL811
44: 67662 cs89x0
45: 0 mk712_touchscreen
Err: 0
어떻게 해야 할지 감을 못 잡고 있습니다.
부디 많은 조언 부탁드립니다.
그럼 무더운 여름에 건강 조심 하세요.