도와주세요!!
글 수 15,339
2003.12.18 15:17:49 (*.111.160.131)
6754
안녕하세요?
GPIO 0 인터럽트 등록시에 질문이 있습니다.
GPIO 0 는 현재 아무것도 사용하지 않는 것으로 알고 있으며, 제가 인터럽트로 등록하여 사용하려 합니다.
드라이버는 아래와 같이 작성하였으며 Config.in, Makefile 을 수정하여 커널 내부에 부팅시 초기화 하였습니다.
그런데 부팅시에 인터럽트 등록하면서 아래와 같은 메세지를 뿌리며 제대로 된 동작을 하지 않습니다.
처음에는 제대로 등록된줄 알고, 어플리케이션 프로그램도 작성하여 디바이스를 열고 읽기도 해보았습니다. 어플리케이션에서는 디바이스를 열때 잘 열렸음을 확인했고, 읽기 데이터에서는 정상 동작을 수행하지 못하였습니다.
도움 부탁 드립니다.
- 메세지 -
......
RAMDISK driver initialized: 16 RAM disks of.........
loop: loaded (max 8 devices)
GETTMG driver registered: major = 0 --> 여기부터 드라이버 관련 메세지...
IRQ LOCK: IRQ1 is locking the system, disabled --> Lock 되어 있단 메세지...
GetTmg registered successfully.. --> 등록 완료..
.........
부팅시 메세지로 봤을 때 LOCK되어 있는 것처럼 보여서 다른 곳에서 등록하는지 확인해 보려 했지만 찾을 수가 없었습니다.
드라이버 코드.
void GetTmg_handler(int irq, void *dev_id, struct pt_regs *regs)
{
인터럽트 처리 루틴..
}
int GetTmg_open (struct inode *inode, struct file *file)
{
printk ("open..ok
");
return 0;
}
ssize_t GetTmg_read (struct file *inode, char *gdata, size_t length, loff_t *off_what)
{
if( get_flag > 1 )
{
get_flag = 0;
copy_to_user( gdata, (unsigned char *)buff, sizeof(buff) );
}
return (length);
}
static struct file_operations GetTmg_fops =
{
open: GetTmg_open,
read: GetTmg_read,
release: GetTmg_release,
};
void init_GPIO(void)
{
GAFR0_L &= MASK_GAFR0_L;
GAFR0_U &= MASK_GAFR0_U;
GAFR1_L &= MASK_GAFR1_L;
GEDR0 |= MASK_GPDR0;
GEDR1 |= MASK_GPDR1;
GPDR0 &= ~(MASK_GPDR0);
GPDR1 &= ~(MASK_GPDR1);
set_GPIO_IRQ_edge( 0, GPIO_RISING_EDGE ); // GRER0를 설정하는지 확인할것..
}
static int __init GetTmg_init(void)
{
int return_val;
/*
* Register the character device
*/
Major = register_chrdev (GETTMG_MAJOR, DEVICE_NAME, &GetTmg_fops);
/* Negative values signify an error */
if (Major < 0) {
printk ("GETTMG init_module: failed with %d
", Major);
return Major;
}
init_GPIO();
printk ("GETTMG driver registred: major = %d
", Major);
return_val = request_irq(IRQ_GPIO(0), GetTmg_handler, SA_INTERRUPT, "GETTMG From TEST BD", NULL );
if( return_val < 0 )
{
printk(KERN_ERR "Get Image init() : Can't reqeust irq %#010x.. Return Value : %d
", IRQ_GPIO(0), return_val );
return -1;
}
printk("GetTmg registered successfully..
");
get_flag = 0;
return 0;
}
static void __exit GetTmg_exit (void)
{
int ret;
/*
* Unregister the device
*/
ret = unregister_chrdev (Major, DEVICE_NAME);
/*
* If there's an error, report it
*/
if (ret < 0) {
printk ("unregister_chrdev: error %d
", ret);
}
else {
printk ("module clean up ok!!
");
}
return ;
}
module_init(GetTmg_init);
module_exit(GetTmg_exit);
GPIO 0 인터럽트 등록시에 질문이 있습니다.
GPIO 0 는 현재 아무것도 사용하지 않는 것으로 알고 있으며, 제가 인터럽트로 등록하여 사용하려 합니다.
드라이버는 아래와 같이 작성하였으며 Config.in, Makefile 을 수정하여 커널 내부에 부팅시 초기화 하였습니다.
그런데 부팅시에 인터럽트 등록하면서 아래와 같은 메세지를 뿌리며 제대로 된 동작을 하지 않습니다.
처음에는 제대로 등록된줄 알고, 어플리케이션 프로그램도 작성하여 디바이스를 열고 읽기도 해보았습니다. 어플리케이션에서는 디바이스를 열때 잘 열렸음을 확인했고, 읽기 데이터에서는 정상 동작을 수행하지 못하였습니다.
도움 부탁 드립니다.
- 메세지 -
......
RAMDISK driver initialized: 16 RAM disks of.........
loop: loaded (max 8 devices)
GETTMG driver registered: major = 0 --> 여기부터 드라이버 관련 메세지...
IRQ LOCK: IRQ1 is locking the system, disabled --> Lock 되어 있단 메세지...
GetTmg registered successfully.. --> 등록 완료..
.........
부팅시 메세지로 봤을 때 LOCK되어 있는 것처럼 보여서 다른 곳에서 등록하는지 확인해 보려 했지만 찾을 수가 없었습니다.
드라이버 코드.
void GetTmg_handler(int irq, void *dev_id, struct pt_regs *regs)
{
인터럽트 처리 루틴..
}
int GetTmg_open (struct inode *inode, struct file *file)
{
printk ("open..ok
");
return 0;
}
ssize_t GetTmg_read (struct file *inode, char *gdata, size_t length, loff_t *off_what)
{
if( get_flag > 1 )
{
get_flag = 0;
copy_to_user( gdata, (unsigned char *)buff, sizeof(buff) );
}
return (length);
}
static struct file_operations GetTmg_fops =
{
open: GetTmg_open,
read: GetTmg_read,
release: GetTmg_release,
};
void init_GPIO(void)
{
GAFR0_L &= MASK_GAFR0_L;
GAFR0_U &= MASK_GAFR0_U;
GAFR1_L &= MASK_GAFR1_L;
GEDR0 |= MASK_GPDR0;
GEDR1 |= MASK_GPDR1;
GPDR0 &= ~(MASK_GPDR0);
GPDR1 &= ~(MASK_GPDR1);
set_GPIO_IRQ_edge( 0, GPIO_RISING_EDGE ); // GRER0를 설정하는지 확인할것..
}
static int __init GetTmg_init(void)
{
int return_val;
/*
* Register the character device
*/
Major = register_chrdev (GETTMG_MAJOR, DEVICE_NAME, &GetTmg_fops);
/* Negative values signify an error */
if (Major < 0) {
printk ("GETTMG init_module: failed with %d
", Major);
return Major;
}
init_GPIO();
printk ("GETTMG driver registred: major = %d
", Major);
return_val = request_irq(IRQ_GPIO(0), GetTmg_handler, SA_INTERRUPT, "GETTMG From TEST BD", NULL );
if( return_val < 0 )
{
printk(KERN_ERR "Get Image init() : Can't reqeust irq %#010x.. Return Value : %d
", IRQ_GPIO(0), return_val );
return -1;
}
printk("GetTmg registered successfully..
");
get_flag = 0;
return 0;
}
static void __exit GetTmg_exit (void)
{
int ret;
/*
* Unregister the device
*/
ret = unregister_chrdev (Major, DEVICE_NAME);
/*
* If there's an error, report it
*/
if (ret < 0) {
printk ("unregister_chrdev: error %d
", ret);
}
else {
printk ("module clean up ok!!
");
}
return ;
}
module_init(GetTmg_init);
module_exit(GetTmg_exit);