기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
다음은 arch/arm/mach-s5pv310/cpu.c 에 있는 내용입니다.
static struct map_desc s5pv310_iodesc[] __initdata = {
...
}, {
.virtual = (unsigned long)S3C_VA_WATCHDOG,
.pfn = __phys_to_pfn(S3C_PA_WDT),
.length = SZ_4K,
.type = MT_DEVICE,
}, {
...
};
물리주소를 가상주소로 static 메핑한 것인데 특정영역에 __raw_writel시
write가 되지 않습니다. write는 간단한 driver를 작성하여 진행했습니다.
왜 이런지 아시는분 계신가요?
추가로 write 방식은 mknod로 장치파일(/dev/gpio) 하나 만들고 드라이버 올려서
echo 1234 > /dev/gpio 와 같은 식으로 진행하였습니다. 그런데 이상하게도
write operation이 10번 이상 호출되는군요. 왜 이런지도 아시는 분 계신가요?
간략히 소스 올려드리겠습니다.
전부는 아니고 일부만 올려드리겠습니다^^;;
// test.c (test용 모듈로 write read op부분만 올렸습니다^^;;)
ssize_t drv_write(struct file *flip, char *buf, size_t count, loff_t *_pos){
unsigned char status=0;
unsigned int wtcon = 0;
wtcon += (buf[0] - 48) * 0x10000000;
wtcon += (buf[1] - 48) * 0x1000000;
wtcon += (buf[2] - 48) * 0x100000;
wtcon += (buf[3] - 48) * 0x10000;
wtcon += (buf[4] - 48) * 0x1000;
wtcon += (buf[5] - 48) * 0x100;
wtcon += (buf[6] - 48) * 0x10;
wtcon += (buf[7] - 48);
printk("%X\n", wtcon);
__raw_writel(wtcon, S3C2410_WTCNT);
return status;
}
ssize_t drv_read(struct file *filp, char *buf, size_t count, loff_t *_pos){
unsigned char status=0;
unsigned int wtcon = 0;
printk("WTCON :%X\n ", __raw_readl(S3C2410_WTCON));
printk("WTDAT :%X\n ", __raw_readl(S3C2410_WTDAT));
printk("WTCNT :%X\n ", __raw_readl(S3C2410_WTCNT));
return status;
}
// arch/arm/mach-s5pv310/cpu.c (io mapping 부분만...)
static struct map_desc s5pv310_iodesc[] __initdata = {
{
...
}, {
.virtual = (unsigned long)S3C_VA_WATCHDOG,
.pfn = __phys_to_pfn(S3C_PA_WDT),
.length = SZ_4K,
.type = MT_DEVICE,
},
};
// arch/arm/plat-samsung/include/plat/map-base.h (VA 정보)
#define S3C_ADDR_BASE (0xF4000000)
#define S3C_ADDR(x) (S3C_ADDR_BASE + (x))
#define S3C_VA_WATCHDOG S3C_ADDR(0x00400000) /* watchdog */
// arch/arm/mach-s5pv310/include/mach/map.h (PA 정보)
#define S5PV310_PA_WATCHDOG (0x10060000)
#define S3C_PA_WDT S5PV310_PA_WATCHDOG
뭔가 제가 잘 모르는 부분이군요...
저는 보통 테스트용도로 CPU 레지스터값 확인할때 busybox의 devmem 유틸을 사용합니다.
사용하기만하고 소스를 안봐서 정확히 어떤 구성인지는 모르겠지만
sonbong님이 올리신 소스가 같은 기능의 소스인거 같네요(맞나요?)
(/dev/mem의 용도는 물리메모리 액세스 할 수 있게 해주는 디바이스 파일로 알고 있습니다)
같은 기능이라면 busybox의 devmem.c와 drivers/char/s3c_mem.c를 참고하시면 도움이 될것 같네요.
busybox devmem 유틸은 write하는 부분이 주석처리돼있는거 같네요
/ # busybox devmem 0x10060000
0x00008021
/ # busybox devmem 0x10060004
0x00008000
/ # busybox devmem 0x10060008
0x00008000
/ # busybox devmem 0x1006000C
0x00000000
음......
S3C_VA_WATCHDOG이 register 영역 아닌가요?
memory 영역이 아니라.
register에 대한 write를 원하시는 것인지 아니면 memory 관련인지 궁금합니다.
즉, manual을 봐봐야 결론이 나겠지만, 특정 register들은 read-only가 있을 수 있거든요.