jutylor의 모든 글

MTD 사용시 cannot allocate memory 메세지 문제.

Embedded Linux 나 uClinux 에서 플래시 메모리를 디스크처럼 사용할 수 있도록 하는 기술이 바로 Memory Technology Device(이하 MTD) 입니다.

개발 단계에서는 부트로더나 커널, 램 디스크 이미지를 자주 지우고 쓰거나, 주소를 바꾸기 때문에 실제 사용하지 않지만 플래시 메모리 상에서는 파일이 있는 것으로 플래그가 체크되어있어 문제가 발생하는 경우가 종종 발생합니다.

이 문제점은 플래시 메모리에 전체적으로 데이터를 다시 넣을 때 주의를 하면 문제가 없지만,
만약 위의 오류메세지가 나타났을 떄,
MTD 영역이 커널 빌드시 설정했던 것 보다 작을 경우,
파일을 넣는 도중 오류가 나타날 경우,
파일을 넣었을 때 실제 파일 용량보다 크게 차이가 있을 경우 등 의 문제가 있을 때 해결책이 될 수 있고, 의외로
U-Boot 에서 nand 명령으로 쉽게 해결이 가능합니다.

U-Boot 에는 nand 라는 낸드플래시와 관련된 명령들이 있습니다.
>help nand<ENTER>
를 해보면 write, read, eraseall, erase 등 다양한 명령들이 존재하는데, 부트로더, 커널의 영역이 조정되어 이전과 다른 플래시의 주소에 다시 넣을 때 플래시를 모두 클리어 시켜주는 것이 오류로 인해 삽질하는 것을 방지하는 예방법이 될 수 있습니다.

>nand erase clean<ENTER>
이 명령을 입력하면 플래시의 0x0 번지 부터 끝까지 초기화를 시켜줍니다.  물론 이 명령 이후에 시스템을 리셋하면 네트워크 부팅 모드가 아닌 이상 시스템이 먹통이 되겠지요.

만약 MTD 영역만을 포멧해야 되겠다. 할 경우 커널이 로드될 때 메세지를 잘 보셔야 합니다.  물론 본인이 커널 포팅을 하였다면 MTD 영역으로 쓰이는 플래시의 영역이 어디인지 아니 상관 없지만, 포팅되어 온 커널이라면 부팅시 MTD 초기화시 MTD 영역의 시작 주소와 끝 주소가 나타납니다.

필자의 화사 장비의 경우 [ 0x600000 – 0x2000000 ] 라고 나타납니다.

16 진수 계산이 가능한 계산기를 통해 (끝 주소 – 시작주소) 를 계산하여, MTD 영역의 사이즈를 구하도록 합니다.
위의 경우 0x2000000 – 0x600000 = 0x1A00000 입니다.

U-Boot 로 들어가서 아래와 같이 타이핑 합니다.
>nand erase 0x600000 0x1A00000<ENTER>

삭제가 완료되었다고 나오면, 재부팅 시켜 MTD 영역을 보고, 테스트용 파일을 넣거나 폴더를 생생해 보면 정상동작이 됩니다.

양산 단계에서는 비어있는 플래시를 사용하기 때문에 문제가 생기지 않는데 개발 단계에서는 nand erase 명령을 해주는 것이 삽질을 막는 요령이라는 것을 기억하세요.