빠른 답변 감사 합니다.

그럼 제가 바르게 이해하고 있는지 좀 봐 주십시요~
일단 디바이스 드라이버를 하나 만들고 ...

mknod device01 c 200 1
mknod device02 c 200 2
mknod device03 c 200 3
mknod device04 c 200 4

이렇게 노드를 만들고

insmod device.o

이렇게 드라이버를 올리고

어플에서 사용 할때는

dev01 = open("/dev/device01", O_RDWR|O_NDELAY);
dev02 = open("/dev/device02", O_RDWR|O_NDELAY);
dev03 = open("/dev/device03", O_RDWR|O_NDELAY);
dev04 = open("/dev/device04", O_RDWR|O_NDELAY);

ioctl(dev01, DEVICE_ADDR, 0xF0100030); ioctl(dev01, DEVICE_IRQ, 3);
ioctl(dev02, DEVICE_ADDR, 0xF0100050); ioctl(dev02, DEVICE_IRQ, 4);
ioctl(dev03, DEVICE_ADDR, 0xF0100070); ioctl(dev03, DEVICE_IRQ, 5);
ioctl(dev04, DEVICE_ADDR, 0xF0100090); ioctl(dev04, DEVICE_IRQ, 6);

이런식으로 하고 드라이버에선

int init_module(void)
{
if(register_chrdev(200, DEVICE_NAME, &device_fops) < 0) {
return -ENODEV;
}
}

이렇게 I/O ADDR 영역등록이나 IRQ 등록을 하지않고 그냥 디바이스만 등록하고
바로 빠져 나와주고~ (뭐 실제로 ADDR, IRQ 를 모르니 ^^)

int device_ioctl(struct inode *minode, struct file *mfile, unsigned int cmd, unsigned long arg)
{
switch(cmd) {
case DEVICE_ADDR :
DeviceADDR = arg;
if(check_region(DeviceADDR, DEVICE_REGION)) {
free_irq(DeviceIRQ, NULL);
printk(DEVICE_NAME " : Unable to get IO region
");
return -ENODEV;
}
request_region(DeviceADDR, DEVICE_REGION, DEVICE_NAME);
return 0;
case DEVICE_IRQ :
DeviceIRQ = arg;
if(request_irq(DeviceIRQ, device_interrupt, 0, DEVICE_NAME, ULL)) {
printk(DEVICE_NAME " : Unable to get IRQ %d
", DeviceIRQ);
return -EBUSY;
}
#ifdef SA1100_IRQ_TO_GPIO
set_GPIO_IRQ_edge (1 << SA1100_IRQ_TO_GPIO(DeviceIRQ),GPIO_RISING_EDGE);
#else
set_GPIO_IRQ_edge (1 << DeviceIRQ, GPIO_RISING_EDGE);
#endif
enable_irq(DeviceIRQ);
return 0;
}
return -EINVAL;
}

이런식으로 ioctl 을 이용 해서 I/O ADDR 영여과 IRQ 를 등록해서 사용 한다.

맞습니까 ? 혹시 잘못 이해하고 있거나 더좋은 방법이 있으면 알려주세요~

개구리 wrote..
: 동일한 입출력 방식을 갖는 디바이스 드라이버를 만들때
: 주번호는 기능에 대한 구현에 대한 처리로 보셔야 하고
: 부번호는 하드웨어 구분으로보시는 것이 일반적인 관례입니다.
:
: 또한 대부분의 경우 어드레스는 고정되거나 PCI 처럼
: 할당되더라도 어느정도는 고정되므로
: 임베디드 시스템에서는 고정합니다.
:
: 실제로 하드웨어를 장치파일로 열때
: 하드웨어 초기화 과정을 거치고
: 이때 소스상에서 할당하는 것이 일반적입니다.
:
: 모듈에서 직접적으로 할당은 잘 안합니다.