вот основные регистры которые нас интересуют#define CNTRBASE 0x60000000
#define ADDR (CNTRBASE+0x300)
#define CMD (CNTRBASE+0x304)
#define CFG1 (CNTRBASE+0x328)
#define CFG2 (CNTRBASE+0x330)
таблица команд полностью совпадает с контроллерами ранних семейств и конечно с MSM6280 тоже
под рукой не обнаружил - в доке есть..
вот фрагмент кода стирания блока.void nand_blockerase(unsigned int block) {
DWORD addr;
memory_poke(CMD,0,1);
nand_wait();
addr=block*page_size*pages_per_block;
memory_poke(ADDR,addr,1);
memory_poke(CFG2,0,1);
memory_poke(CMD,4,1);
Sleep(300); // не помню почему так долго.. может чтобы в глазах не рябило

printf("X");
}
чтение по принципу --> софтовый сброс контроллера -ожидание ини -> конфиг CFG1 в зависимости от организации флешки -> нулим регистр CFG2 -> засылаем адрес -> засылаем команду ->ожидаем перемещения данных в буфер->читаем нулевой сектор (если секторов четыре-читаем еще три раза с ожиданием перемещения)
запись почти аналогично == софт сброс-> ожидание -> конфиг флешки -> конфиг 2 в ноль все разряды ->данные в буфер- >команда записи (если секторов четыре-то повторить еще три раза не меняя адреса ,не конфигуря еще раз регистры и конечно не сбрасывая)
вот такие конфиги у меня получились рабочими -
if (nand_cpsty==64) { memory_poke(CFG1,0x20b,1); }
if (nand_cpsty==128) { memory_poke(CFG1,0x253,1); }
if (nand_cpsty==256) { memory_poke(CFG1,0x2E1,1); }
но эти конфиги самых распространенных флешек
последний бит управляет движком ECC -традиция ;-)
Скрытый текст
if (nid==0xAD36||nid==0xAD76||nid==0xEC36||nid==0x9836||nid==0xEC76||nid==0x9876) { // сюда добавлять id новые 64 метра
printf("== Type NAND recognized !! == capacity 64 Mb - 16 bit \n");
printf("== PageSize: 0x200, Page-per-Block: 0x20 ,Blocks-per-Device: 0x1000\n");
pages_per_block=0x20; // свойственно для флеша с размером 64M
page_size=0x200; //
blocks_per_device=0x1000;
nand_cpsty=64;
y=0;
}
if (nid==0xAD78||nid==0xAD79||nid==0xEC78||nid==0xEC79||nid==0x9878||nid==0x9879) { // сюда добавлять id новые 64 метра
printf("== Type NAND recognized !! == capacity 128 Mb - 16 bit \n");
printf("== PageSize: 0x200, Page-per-Block: 0x20 ,Blocks-per-Device: 0x2000\n");
pages_per_block=0x20; // свойственно для флеша с размером 128M но с маленькими страницами
page_size=0x200; //
blocks_per_device=0x2000;
nand_cpsty=64;
y=0;
}
if (nid==0xADB1||nid==0xADA1||nid==0xECB1||nid==0xECA1||nid==0x98B1||nid==0x98A1) { // сюда добавлять id новые 128 метров
printf("== Type NAND recognized !! == capacity 128 Mb - 16 bit \n");
printf("== PageSize: 0x800, Page-per-Block: 0x40 ,Blocks-per-Device: 0x400\n");
pages_per_block=0x40; // свойственно для флеша с размером 128M
page_size=0x800;
blocks_per_device=0x400;
nand_cpsty=128;
y=0;
}
if (nid==0xADAA||nid==0xECAA||nid==0x98AA||nid==0xC8AA||nid==0xC8BA||nid==0xADBA||nid==0xECBA||nid==0x98BA) { // сюда добавлять id новые 256 метров
printf("== Type NAND recognized !! == capacity 256 Mb - 16 bit \n");
printf("== PageSize: 0x800, Page-per-Block: 0x40 ,Blocks-per-Device: 0x800\n");
pages_per_block=0x40; // свойственно для флеша с размером 256M
page_size=0x800;
blocks_per_device=0x800;
nand_cpsty=256;
y=0;
}
if (nid==0xADBC||nid==0xECBC||nid==0x98BC) { // сюда добавлять id новые 512 метров
printf("== Type NAND recognized !! == capacity 512 Mb - 16 bit \n");
printf("== PageSize: 0x800, Page-per-Block: 0x40 ,Blocks-per-Device: 0x1000\n");
pages_per_block=0x40; // свойственно для флеша с размером 256M
page_size=0x800;
blocks_per_device=0x1000;
nand_cpsty=512;
y=0;
}
не факт что 512 работает под этим контроллером - не попадалась но на шину адреса вроде должна ложиться
нормальных исходников пока на этом компе не обнаружил-только наброски -но точно рабочие..
найду полный нормальный отправлю тебе на почту..