


Как оказалось контроллер в дисплее S1D15G14. По крайней мере последовательность инициализации прокатила

Вот, пока белый экран:
Работает вроде по доке, потому что если врубить в настройках инверсию экран чернеет

Буду ковырять дальше
Moderator: Shaos
Code: Select all
+00h - byte признак активности раздела (80h - активен)
+01h - byte номер поверхности начала раздела
+02h - word номер цилиндра и сектора начала раздела (запакованы)
+04h - byte код типа раздела
+05h - byte номер поверхности конца раздела
+06h - word номер цилиндра и сектора конца раздела (запакованы)
+08h - dword абсолютный (логический) номер сектора начала
+0Ch - dword размер раздела в логических секторах
Для LBA режима последние dword'ы указывают на реальные сектора.
Code: Select all
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
0000001B0 00 00 00 00 00 2C 44 63 AB E2 AB E2 00 00 80 01 .....,Dc«в«в..€.
0000001C0 01 00 07 FE FF FF 3F 00 00 00 6B D5 7D 02 00 FE ...юяя?...kХ}..ю
0000001D0 FF FF 07 FE FF FF AA D5 7D 02 1B 0A D4 06 00 00 яя.юяяªХ}...Ф...
Code: Select all
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
0000001B0 00 00 00 00 00 00 00 00 E9 96 E9 96 00 00 00 82 ........й–й–...‚
0000001C0 03 00 0B 06 E5 A1 00 20 00 00 00 A0 DE 01 00 00 ....е¡. ... Ю...
Code: Select all
FS_err=SD_init(); //Инициализация карты
if (FS_err!=FS_READY) {return;}; //Возникла ошибка
FS_err=SD_setBlockSize(0x200); //Размер блока 512 байт
if (FS_err!=FS_READY) {return;}; //Возникла ошибка
/*
Читаю нулевой сектор диска. Из него добываю необходимую информацию
*/
FS_err=SD_read(0x00000000,ReadBuff);
if (FS_err!=FS_READY) {return;};
if (FS_checkForBoot(ReadBuff)) {goto PBRread;}; //Если это не MBR...
if (FS_checkSignature(ReadBuff)!=TRUE) {FS_err=FS_NTFMT; return;};
//это master boot record диска
//Смещение от начала 0x1BE
BootDescriptor=ReadBuff[446]; //boot indicator (80h = active partition)
FirstPartSector=((unsigned long int)ReadBuff[449])<<8;
FirstPartSector+=((unsigned long int)ReadBuff[448])<<8;
FirstPartSector+=ReadBuff[447]; //Первый сектор раздела
StartHead=ReadBuff[447];
StartSector=(ReadBuff[448]&0x3F);
StartTrack=((((unsigned int)(ReadBuff[448]&0xC0))<<2)+ReadBuff[449]);
FS_descriptor=ReadBuff[450]; //Описатель Файловой системы
LastPartSector=((unsigned long int)ReadBuff[453])<<8; //Последний сектор раздела
LastPartSector+=((unsigned long int)ReadBuff[452])<<8;
LastPartSector+=ReadBuff[451];
HeadCount=ReadBuff[451]+1;
SectorCount=(ReadBuff[452]&0x3F);
TrackCount=((((unsigned int)(ReadBuff[452]&0xC0))<<2)+ReadBuff[453])+1;
NumFirstSector=((unsigned long int)ReadBuff[457])<<8; //sectors preceding partition
NumFirstSector+=((unsigned long int)ReadBuff[456])<<8;
NumFirstSector+=((unsigned long int)ReadBuff[455])<<8;
NumFirstSector+=ReadBuff[454];
NumSectOfPart=((unsigned long int)ReadBuff[461])<<8; //Количество секторов в разделе
NumSectOfPart+=((unsigned long int)ReadBuff[460])<<8;
NumSectOfPart+=((unsigned long int)ReadBuff[459])<<8;
NumSectOfPart+=ReadBuff[458];
PBR=NumFirstSector*512; //По имеющимся данным вычисляем расположение первого сектора диска.
FS_err=SD_read(PBR, ReadBuff);
if (FS_err!=FS_READY) {return;};
if (FS_checkSignature(ReadBuff)!=TRUE) //Если бут сектора по указаному адресу нет, пробуем найти
{
for (unsigned long int j=1;j<512;j++) //Ищем в первых 512 секторах
{
PBR=j*512;
FS_err=SD_read(PBR, ReadBuff);
if (FS_err!=FS_READY) {return;};
if (FS_checkForBoot(ReadBuff)) {goto PBRread;}; //Если нашли
};
FS_err=FS_NTFMT; //или не нашли...
return;
};
PBRread:
LCD_GotoXY(0,6);
LCD_putstr("PBR at ",CP_DOS);
LCD_putstr(ultoa(PBR,Digits,16),CP_DOS);
LCD_putchar('h',CP_DOS);
//Чтение Partition Boot Record