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

c110의 OneNAND를 u-boot 상에서는 onenand 커맨드를 이용해

onenand read, onenand write, onenand erase 등을 활용해 제어는 가능합니다.

 

문제는 안드로이드 어플에서 OneNAND의 특정 파티션의 데이터를 얻어갈 필요가 있어서

안드로이드 어플 JAVA layer -> JNI -> C layer -> user space -> char dev -> kernel space 까지 내려와

커널 소스상에서 OneNAND를 제어하려고 합니다.

 

일주일을 삽질하면서 커널 소스상에서 read/write 는 어떻게 짜맞추긴 했는데

현재 문제가 OneNAND에 write 하기 전에 꼭 erase 를 해줘야하는데...

(erase 안하고 write 할 경우 해당 블럭이 배드블럭 처리가 되어버리네요. T_T)

이 rease 를 커널 소스상에서 처리하지 못해 write를 못하고 있습니다.

 

mtd-utils을 빌드해 flash_erase 란 툴을 이용하면 커널 MTD driver의 ioctl을 거쳐 OneNAND가 잘 지워지는데

제가 구현해야 하는 환경이 커널에서 OneNAND를 erase 해야하기 때문에

OneNAND를 지우기 위해 필요한 struct erase_info 구조체 내용을 채우지 못해서

onenand_base.c 의 onenand_erase 함수를 호출하면 인자중 NULL point가 있다고

커널 패닉으로 OneNAND의 특정 addr의 한블럭을 지우지 못하고 있습니다.

 

혹시 커널에서 OneNAND의 특정 블럭을 지우려면 어떤 절차로 구현할수 있는지

커널의 user 영역의 /dev/mtd/mtd0 같은 char nod를 통하지 않고

커널에서만 지울수 있는 방법이 있는지 문의 드립니다.


funmoney

2011.09.02 20:29:37
*.169.251.167

mtd device driver 를 경유하여 physical onenand 를 제어하는 구조로 되어 있다면

이미 mtd device driver 에 구현하기고자 하는 기능이 구현되어 있습니다.

 

mtd device driver 는 HW 를 직접 제어하는 driver 가 아니고 그 하위에 HW 관련된 driver 를 따로 가지고 있으며

OS 와 APP 에게 서비스하는 logical driver 로 보셔야 합니다.

 

즉 , 지우시고자 하는 부분이 /dev/mtd0 에 있는 있다면  이 디바이스 파일을 open 하시어 ioctl() 함수를 app 수준에서

호출하여 원하는  block 을 지울 수 있습니다.

 

app 로 부터의 호출이 없이 Kernel 이 스스로 지워야 한다면 ./drivers/mtd/mtdchar.c 에서 ioctl 을 분석하여

이것을 응요하시는 것도 좋을 듯 합니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
» OneNAND를 kernel에서 erase 하는 방법? [1] 텡구 2011-09-02 1386

사용자 로그인