linux driver 작성중 특정 메모리주소에 write가 안되는 문제
watchdog 관련 디바이스 드라이버를 만들고 있습니다.
구현하려는 내용은 system을 watchdog timer를 통해 강제종료시키면 됩니다.
(꼭 watchdog timer를 통해 종료시켜야 합니다.)
cpu는 ARM cortex a9입니다.
watchdog time control register(이하 wtcon)의 물리주소는 0x10060000 입니다.
u-boot에서 해당주소에 1을 입력하면 시스템이 reboot 됩니다.
문제는 driver를 작성해 kernel로 올려서 1을 넣으면 write가 안되는것 같습니다.(추정)
구현방식은 매우 간단합니다.
wtcon = ioremap(0x10060000);
writel(1, wtcon);
iounmap(wtcon);
위의 코드가 전부입니다.
ioremap은 정상적으로 0x10060000에 대한 가상주소를 return 하는것 같습니다.
0x10060000 + 4 의 주소는 watchdog timer data register인데
u-boot에서 확인한 값과 driver를 통해 확인한 값이 동일한 값을 가지고 있습니다.(초기값 0x8000)
(0x10060000 + 8 의 register도 동일한 초기값을 가지는걸로 봐서 ioremap은 정상적으로 주소를 할당한 것으로 추정됩니다.)
문제는 writel후 readl을 통해 wtcon 을 확인해보면 write가 정상적으로 안된것 같습니다.
혹시 아시는분 없을까요?
댓글 달기