OSDev http://osdev.su/ |
|
Отличия ahci от idei http://osdev.su/viewtopic.php?f=7&t=494 |
Страница 1 из 1 |
Автор: | Станислав [ 13 фев 2012, 05:23 ] |
Заголовок сообщения: | Отличия ahci от idei |
http://www.intel.com/technology/seriala ... rev095.pdf Написав ф-и работы с дисками через ide пишу ф-и для ahci и сравниваю их Для начала также перебераю PCI и ищу класскод 010601h Дальше у achi нужно читать ABAR AHCI Base Address <BAR5> , т.к. по этому адресу читаем заголовок Generic Host Control и со смешением 100h идут данные о дисках раэмером 80h один за другим 00 1F Generic Host Control 0-31 20 9F Reserved 32-159 A0 FF Vendor Specific registers 160-255 100 17F Port 0 port control registers 256-383 180 1FF Port 1 port control registers 384-511 200 FFF (Ports 2 – port 29 control registers) 512-4095 1000 107F Port 30 port control registers 4096-4223 1080 10FF Port 31 port control registers 4224-4351 Пакет изменился не очень, добавили к адресу, но про флаг ни чего не сказали, в ide ставится заглушка. align 4 PRDT: .PRD_ADDR dd 0 .PRD_ADDRU dd 0 .PRD_RES dd 0 .PRD_COUNT dw 0 .PRD_FLAG dw 0 00 03 ID Identifiers 0-3 04 05 CMD Command Register 4-5 06 07 STS Device Status 6-7 08 08 RID Revision ID 8 09 0B CC Class Codes 9-11 0C 0C CLS Cache Line Size 12 0D 0D MLT Master Latency Timer 13 0E 0E HTYPE Header Type 14 0F 0F BIST Built In Self Test (Optional) 15 10 23 BARS Other Base Address Registres (Optional) <BAR0-4> 16-35 24 27 ABAR AHCI Base Address <BAR5> 36-39 2C 2F SS Subsystem Identifiers 44-47 30 33 EROM Expansion ROM Base Address (Optional) 48-51 34 34 CAP Capabilities Pointer 52 3C 3D INTR Interrupt Information 60-61 3E 3E MGNT Min Grant (Optional) 62 3F 3F MLAT Max Latency (Optional) 63 Про адрес сказали, что он 31-13 31:13 RW 0 Base Address (BA) 12:04 RO 0 Reserved 03 RO 0 Prefetchable (PF) 02:01 RO 00 Type (TP) 00 RO 0 Resource Type Indicator (RTE) |
Автор: | Станислав [ 14 фев 2012, 13:35 ] |
Заголовок сообщения: | Re: Отличия ahci от idei |
Заглужка не нужна, т.к. в командах мы должны указывать количество таблиц Вот здесь подсказал мне Илья смотреть http://wiki.osdev.org/AHCI#Find_an_AHCI_controller Там хорошо написано. typedef struct tagHBA_CMD_HEADER { // DW0 BYTE cfl:5; // Command FIS length in DWORDS, 2 ~ 16 <------------------------------------------- BYTE a:1; // ATAPI BYTE w:1; // Write, 1: H2D, 0: D2H BYTE p:1; // Prefetchable BYTE r:1; // Reset BYTE b:1; // BIST BYTE c:1; // Clear busy upon R_OK BYTE rsv0:1; // Reserved BYTE pmp:4; // Port multiplier port WORD prdtl; // Physical region descriptor table length in entries // DW1 volatile DWORD prdbc; // Physical region descriptor byte count transferred // DW2, 3 DWORD ctba; // Command table descriptor base address DWORD ctbau; // Command table descriptor base address upper 32 bits // DW4 - 7 DWORD rsv1[4]; // Reserved } HBA_CMD_HEADER; |
Автор: | Станислав [ 14 фев 2012, 15:40 ] |
Заголовок сообщения: | Re: Отличия ahci от idei |
В самом начале работы с Ahci думаю надо прочитать Generic Host Control по адресу бар5, где много полезной инфы. Например количество доступных портов, каким портам доступны прерывания, и т.п. . Потом по тому же адресу со смещением 256 читаем первый порт, где тоже много инфы о диске на этом порте и там есть адрес на список из 32 команд для чтения или записи секторов в память. Я так думаю, что после добавления устройства и получения прирывания об этом нам нужно перепрочитать из Generic Host Control количество действующих портов. |
Автор: | Станислав [ 13 мар 2012, 15:39 ] |
Заголовок сообщения: | Re: Отличия ahci от idei |
Функция для чтения секторов с вики реально рабочая, я её перевёл на фасм и запустил в своёй оси вместо ide шной. Плюсы в том, что больше стало инфы о дисках, и работаем командами mov, а не in out, для этого добавлен дополнительный дма движок в аши, так же можно вешать несколько команд сразу и LFB адрес 48бит. Вот моя: ;cl-номер диска с 0 по 31, esi-номер сектора, edi-адрес в памяти ;ebx-количество байт, dx-количество секторов read_ahci_dma: movzx eax,cl ;первый диск shl eax,7 ;умножим на 128 - 80h add eax,100h ;добавим 256 - 100h add eax,[ahciBUS] ;адрес диска mov ebp,[eax] ;Адрес команд add ebp,32 ;вторая команда, нужно искать свободную и забивать туда mov word[ebp],5 ;pmp=0 C=0 b=0 r=0 p=0 w=0 a=0 cfl=5 add ebp,2 mov word[ebp],1 ;количество таблиц add ebp,2 mov dword[ebp],0 ;размер передоваемых байт от устройства во время передачи изменяется add ebp,4 mov dword[ebp],def39 ;адрес на таблицу с инфой и таблицами [31:07] add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 mov ebp,def39 ;Создадим CFIS mov byte[ebp],27h ;FIS_REG_H2D add ebp,1 mov byte[ebp],80h ;pmport=0 c=1 add ebp,1 mov byte[ebp],25h ;READ SECTORS DMA EXT add ebp,1 mov byte[ebp],0 add ebp,1 mov [ebp],esi ;LBA add ebp,3 mov byte[ebp],40h ;1<<6 LBA mode add ebp,1 shr esi,24 mov [ebp],esi add ebp,4 mov [ebp],dx ;количество секторов add ebp,2 mov word[ebp],0 add ebp,2 mov dword[ebp],0 add ebp,70h ;Создадим PRDT mov [ebp],edi ;куда читать add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 add ebp,4 or ebx, 80000000h ;количество байт и включим прерывания [21:00] mov [ebp],ebx add eax,38h ;запустим нашу команду CI mov ebx,[eax] mov edx,1 shl edx,1 or ebx,edx mov [eax],ebx @@:mov ebx,[eax] test ebx,ebx ;test [eax],edx ;ждём завершения и выходим jnz @b ret Прерывания можно и не включать, по завершении контроллер сам обнуляет бит команды, перед использованием функции нужно забить адреса для команд Забивается в ней только одна прд запись из 65535, если байт забъёте больше, чем 22^2 не прочитает. Нужно на большие объёмы создавать много таблиц прд и проверку на завершение лучше не делать, чтобы проц не занимать, а по завершении запускать команды из обработчика прерываний. |
Автор: | Himik [ 13 мар 2012, 19:33 ] |
Заголовок сообщения: | Re: Отличия ahci от idei |
Кстати на сайте Intel есть ещё спецификация 1.3. http://www.intel.com/content/www/us/en/ ... ev1_3.html |
Автор: | Станислав [ 14 мар 2012, 04:20 ] |
Заголовок сообщения: | Re: Отличия ahci от idei |
да, я ей и пользовался, первая ссылка не помню почему такая, думал, что там 1.3. Кстати спецификацию SATA rev 3 найти не могу, от туда брали инфу для работы с ата, и чтение идентификации диска не сделал ещё. To issue an ATA Identify command to the device, the FIS is constructed at follows. FIS_REG_H2D fis; memset(&fis, 0, sizeof(FIS_REG_H2D)); fis->fis_type = FIS_TYPE_REG_H2D; fis->command = ATA_CMD_IDENTIFY; // 0xEC fis->device = 0; // Master device fis->c = 1; // Write command register After the device receives this FIS and successfully read the 256 words data into its internal buffer, it sends a PIO Setup FIS – Device to Host to tell the host that it’s ready to transfer data and the data size (FIS_PIO_SETUP.tc). After the PIO Setup FIS – Device to Host has been sent correctly, the device sends a DATA FIS to the host which contains the received data payload (FIS_DATA.data). This scenario is described in SATA revision 3.0 as a PIO data-in command protocol. But an AHCI controller will do the latter two steps for the host. The host software needs only setup and issue the command FIS, and tells the AHCI controller the memory address and size to store the received data. After everything is done, the AHCI controller will issue an interrupt (if enabled) to notify the host to check the data. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |