호스트는 DM320(arm9)을 사용하고 있고 I/O memory를 이용해서 OLED controller에 접근 하려고 합니다.
OLED controller는 8bit data line를 사용하고 EMIF에 붙어 있습니다.
#define REG_ADD 0x50400000
unsigned long oled_reg;
module_init()
{
'''''''''
// OLED device mapping
request_mem_region(REG_ADD, sizeof(char), "OLED");
oled_reg = (unsigned long)ioremap(REG_ADD, sizeof(char));
........
}
module_exit()
{.............
// release I/O mapping
iounmap( (void __iomem *) oled_reg);
release_mem_region(REG_ADD, sizeof(char));
.............
}
OLED_open()
{
.........
}
OLED_write()
{
char *oled_buf;
...........
copy_from_user(oled_buf, buf, count);
for(i=0; i<count; i++)
iowrite8(oled_buf[i], (void*)(oled_reg));
............
}
위와 같이 작성하고 ismod해서 module를 올리고 /proc/iomem을 확인하면
...............
50000000-50ffffff : IDE-HDD.0
50400000-50400000 : OLED
................
로 나옵니다.
제가 알기로는 EMIF에서 OLED controller로의 접근은 register의 기본값을 사용하기 때문에 register 값의 변경은 필요없고 device address로 data를 쓰기만 하면 EMIF에 알아서 신호를 내주는 걸로 알고 있습니다.
그런데 remap한 memory에 data를 써도 써지지도 않고 EMIF의 신호도 변화 되지 않습니다.
처음 작성해 보는 driver라... I/O remap방법에 문제가 있는 것인지 다른 곳이 잘 못된 것인지 모르겠습니다.
사용하고 있는 kernel은 2.6.15입니다.
초보라 모르는 부분이 많습니다. 많은 조언 부탁 드립니다.
그게 초기 테스트할때는 더 편합니다.