보드 : ez-m28
OS : red hat 7.1
크로스 컴파일러 : ez-m28 보드 구입할때 포함되 있는 CD ( 크로스컴파일
gcc version : 2.95.2)

Makefile
////////////////////////////////////
KERNELDIR = /usr/arm-linux
CFLAGS = -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -O

all: test.o

clean:
rm -rf *.o
///////////////////////////////////////
DMA 특수목적 레지스터인 DISRC0에 접근하기 위해 request_region함수를 사용
하여 컴파일 한 후 insmod 로 모듈을 올리면 다음과 같은 에러가 발생합니다.
test.o: unresolved symbol request_region
test.o: unresolved symbol check_region

모듈 소스에 ioport.h를 include 했습니다.
include 해야할 다른 해더 파일이 더 있나요??

그리고 혹시나 해서 ioremap도 사용해 봤으나 이 경우는 엉뚱한 값이 읽히더군요.

그래서 include 파일은 ez-m28용 커널소스의 include 파일로 해봤습니다.
컴파일 후 insmod 로 모듈 로드하면 아까와는 좀 다른 에러가 발생합니다.
check_region에서 에러가 발생합니다.
접근하려는 메모리 주소가 0xD0030000인데 접근할수가 없는것 같습니다.
ez-m28로 커널 패치하는과정보면 s3c2800의 메모리맵핑에서 0x1000 0000을
0xD000 0000으로 맵핑한걸로 알고 있습니다.


/////////////////////////////////////////////////////////
/*
#define MODULE
*/
#include
#include

#include


#define V_DMA0_REG_BASE_ADDR 0xD0030000
#define BASE_ADDR 0x10000000
#define DMA0_REG_BASE_ADDR 0x10030000
#define DISRC0 0x0000
#define DIDST0 0x0004
#define DCON0 0x0008
#define DSTAT0 0x000C
#define DCSRC0 0x0010
#define DCDST0 0x0014
#define DMASKTRIG0 0x0018

int init_module(void)
{
unsigned long disrc0;
unsigned long dstat0;
int ret;
void* va_dma0;

printk("Hello, world
");


if( check_region( V_DMA0_REG_BASE_ADDR, 0x1C) )
{
ret = -1;
printk("check_region fail!
");
goto err2;
}
request_region(V_DMA0_REG_BASE_ADDR, 0x1C, "dma0_dev");
printk("D003000 => 0x%x
",*((unsigned long*)V_DMA0_REG_BASE_ADDR));
}

void cleanup_module(void)
{
printk("Goodbye world
");
}