기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

<meta http-equiv="content-type" content="text/html; charset=utf-8">

다음은 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번 이상 호출되는군요. 왜 이런지도 아시는 분 계신가요?

</meta>

고도리

2011.12.08 02:08:04
*.200.239.234

음......

 

S3C_VA_WATCHDOG이 register 영역 아닌가요?

memory 영역이 아니라.

 

register에 대한 write를 원하시는 것인지 아니면 memory 관련인지 궁금합니다.

즉, manual을 봐봐야 결론이 나겠지만, 특정 register들은 read-only가 있을 수 있거든요.

sonbong

2011.12.09 00:06:22
*.125.253.101

제가 글을 잘못읽었네요;; S3C_VA_WATCHDOG은 메모리 영역이 맞는것으로 알고 있습니다.

S3C_PA_WDT가 레지스터 영역입니다.;;

sonbong

2011.12.08 02:20:08
*.125.253.101

답변 감사합니다.

정확히는 register가 맞습니다.(혹시 주소라는 표현이 좀 거슬리셨나요?^^;;)

read only는 아닌것이 u-boot에서 해당 물리주소로 직접 write 했을때는

정상동작(watchdog reset)하던것이 kernel로 올려 write하면 값이 바뀌질 않습니다.

write한 VA는 올바른것 같습니다.(바로 옆 레지스터의 초기값이 8000인데 u-boot에서

확인한 값과 kernel에서 read한 값 모두 8000 입니다.)

sonbong

2011.12.08 02:30:58
*.125.253.101

간략히 소스 올려드리겠습니다.

전부는 아니고 일부만 올려드리겠습니다^^;;



// 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

쾌도난마

2011.12.08 04:01:54
*.36.251.88

va이면 권한을 봐야하지 않을까요?
그쪽 블록을 readonly로 매핑했다면 테이블조정
하시거나 arm mode 변경을 하셔서 접근을 해야 할것 같습니다 ㅎㅎ

sonbong

2011.12.08 19:19:13
*.125.253.101

답변 감사합니다. 

VA에 관한 권한 설정하는 곳이 어딘지 알 수 있을까요?

고도리

2011.12.09 00:55:55
*.200.239.234

그러면 방향을 바꿔서......ioremap_nocache()를 이용해서 테스트 해보시기 바랍니다.

sonbong

2011.12.09 01:24:16
*.125.253.101

해봤는데 안되네요. ㅜㅜ

근데 initial mapping을 통해 mapping된 register에

ioremap으로 접근해도 상관 없나요?

고도리

2011.12.09 02:39:46
*.200.239.234

이중으로 해도 상관은 없을겁니다.....좀 오래된 기억이라 요즘은 어떨지 몰겠지만요.


initial mapping 부분은 빼고 해보시는게 나을 듯 하네요.

노쑤

2011.12.09 06:01:56
*.196.10.202

뭔가 제가 잘 모르는 부분이군요...


저는 보통 테스트용도로 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

sonbong

2011.12.09 20:09:11
*.125.250.101

답변 감사합니다.

devmem으로 테스트한 결과 정상적으로 write 되지 않는걸 확인했습니다.


# ./devmem 0x10060000 32 0x00008021

Memory mapped at address 0x40000000.

Written 0x8021; readback 0x0


readback이 0이네요;; write하지 못하도록 설정이 된것 같은데ㅠ

sonbong

2011.12.16 19:19:44
*.125.253.101

해결되었습니다. clock controll register에서 mask bit를 pass로 변경한뒤

write하니 잘 들어갑니다.^^

고도리

2011.12.17 01:28:13
*.200.239.234

ㅠ.ㅠ.....더 앞쪽 문제였네요.

 

해결되었다니 다행입니다...^^

List of Articles
번호 제목 글쓴이 날짜 조회 수sort
5348 미디어 플레이어의 네트워크 스트림 구현에 대한 문의 [6] whiterub 2012-10-05 1512
5347 노트 PC에 grub rescue> prompt가 뜨는데??? [3] 요셉 2010-07-08 1511
5346 안드로이드에서 Socket데몬 실행시 퍼미션 문제 [2] 사당 2013-02-16 1511
5345 Exynos4(S5PV310) Module loading 문제. [2] 준성아빠 2012-01-02 1510
5344 uart... CTS/RTS TEST에 대해서 의견 부탁드립니다. [2] 이성호 2009-11-27 1508
5343 libmpfr.so.1 : cannot open shared object file: No such f... [4] 하민근 2010-11-17 1508
5342 USB Device속도 관련 [8] lyreisis 2012-06-16 1508
5341 Framework 개발 서비스 연동? 질문 드립니다. [3] Supsupi 2014-01-17 1508
5340 Platform_device와 Platform_driver로 probe 등록,커널 드라이버단... [2] cellius 2010-01-12 1505
5339 WinCE 상에서 SoftAP(HostAP) [3] 신현호 2012-05-10 1505
5338 V310 관련 질문 [6] 신현호 2012-08-24 1505
5337 리눅스 카메라 드라이버 관련..(MT9D111) [2] 김광석 2009-06-03 1504
5336 bootloader 에서 usb device 인식( usb ethernet adator ) [3] 황기천 2008-01-10 1503
5335 [완료]2440보드에 logitech quickcam messenger를 물리려하고있습니다.[... [3] 김성민 2007-11-16 1503
5334 s3c6410에 ucos를 올릴려고합니다. [7] Supsupi 2012-07-31 1503
5333 엑시노스 5250 RESET 문제?? [2] 윤동열 2013-01-30 1502
5332 안드로이드 파일시스템 부팅시 에러 file [2] 훌러덩 2011-12-01 1501
5331 Android system image에 파일 추가 / init.rc 수정 임성혁 2011-07-21 1501
5330 HDMI 연결시 제품에 화면 출력 여부 설정 방법 문의 [2] 현쓰 2012-05-18 1501
5329 자료실에 현철님이 올려주신 rootfs 부팅에러...[완료] [13] 이홍석 2006-05-04 1500

사용자 로그인