OSDev

для всех
Текущее время: 28 мар 2024, 11:19

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 05 июл 2017, 12:25 

Зарегистрирован: 04 сен 2016, 02:49
Сообщения: 6
есть рабочий код который читает и пишет сектора в режиме PIO lba-28, можно ли его переделать под lba-48 используя 32 битный режим (в интернете нашел только для 64 битного) ниже код который успешно использую:

/* экспорт функции чтения и записи секторов из asm */
extern void ata_read_pio();
extern void ata_write_pio();

/* буфер для записи */
int bufw[15];
/* буфер для чтения */
int bufr[15];
/* кол-во секторов для чтения или записи */
uint32_t sect=1;
/* адрес сектора куда писать или откуда читать */
uint32_t lbasec=3;
/* жесткий диск подключен к мастеру */
uint32_t drive_hdd=0x00;

/* тестовая функция записи */
void testatawrite()
{
bufw[0]=70;
bufw[1]=70;
bufw[2]=69;
bufw[3]=32;
bufw[4]=32;
bufw[5]=32;
bufw[6]=32;
bufw[7]=32;
bufw[8]=32;
bufw[9]=71;
bufw[10]=68;
bufw[11]=70;
bufw[12]=70;
bufw[13]=70;
bufw[14]=70;
bufw[15]=70;
ata_write_pio(bufw, drive_hdd, lbasec, sect );
}

/* тестовая функция чтения */
void testataread()
{
ata_read_pio(bufr, drive_hdd, lbasec, sect);
int systest=bufr[10];
printsys(systest, 300, 150, 0xffffff);
}

функции из асма:

global ata_read_pio
ata_read_pio:
push ebp
mov ebp, esp
push edi
push ebx
pushf

mov ecx, [ebp + 12]
mov dx, cx
and dx, ~1
mov dx, [ata_port_bases]
add dx, 6


; set specified drive & lba on & bits 24-27 of lba address
mov al, cl
and al, 1
shl al, 4
or al, 0xe0
mov ecx, [ebp + 16]
shr ecx, 24
and cl, 0xf
or al, cl
out dx, al

; set sector count
sub dx, 4
mov eax, [ebp + 20]
out dx, al

; set bits 0-23 of lba address
inc dx
mov eax, [ebp + 16]
out dx, al
shr eax, 8
inc dx
out dx, al
shr eax, 8
inc dx
out dx, al


; send read command
add dx, 2
mov al, 0x20
out dx, al

; delay for 400ns for command to register
mov ecx, 4
.delay400ns:
in al, dx
loop .delay400ns

cld

; poll status while drive is busy
.wait_until_done:

in al, dx
test al, 0x80
jne .wait_until_done


; check for error
in al, dx
test al, 1
jne .return_err


push es
mov ax, gs
mov es, ax


; read data
mov ebx, [ebp + 20]
mov edi, [ebp + 8]
.read_loop:
in al, dx
test al, 8
je .read_loop_break
sub dx, 7
mov ecx, 0x100
rep insw
add dx, 7
dec ebx
test ebx, ebx
jne .read_loop
.read_loop_break:


pop es


; return
mov ecx, [ebp + 8]
mov eax, edi
sub eax, ecx
jmp .return
.return_err:
sub dx, 6
in al, dx
or eax, 0xffffff00
.return:
popf
pop ebx
pop edi
pop ebp
xor eax,eax
xor ecx,ecx
ret

; ata_write_pio(source, drive, lba, sector_count)
global ata_write_pio
ata_write_pio:
push ebp
mov ebp, esp
push esi
push ebx
pushf


mov ecx, [ebp + 12]
mov dx, cx
and dx, ~1
mov dx, [ata_port_bases]
add dx, 6


; set specified drive & lba on & bits 24-27 of lba address
mov al, cl
and al, 1
shl al, 4
or al, 0xe0
mov ecx, [ebp + 16]
shr ecx, 24
and cl, 0xf
or al, cl
out dx, al

; set sector count
sub dx, 4
mov eax, [ebp + 20]
out dx, al

; set bits 0-23 of lba address
inc dx
mov eax, [ebp + 16]
out dx, al
shr eax, 8
inc dx
out dx, al
shr eax, 8
inc dx
out dx, al

; send write command
add dx, 2
mov al, 0x30
out dx, al

; delay for 400ns for command to register
mov ecx, 4
.delay400ns:
in al, dx
loop .delay400ns

cld

; poll status while drive is busy
.wait_until_done:

in al, dx
test al, 0x80
jne .wait_until_done

; check for error
in al, dx
test al, 1
jne .return_err

push ds
mov ax, gs
mov ds, ax


; write data
mov ebx, [ebp + 20]
mov esi, [ebp + 8]
.read_loop:
in al, dx
test al, 8
je .read_loop_break
sub dx, 7
mov ecx, 0x100
rep outsw
add dx, 7
dec ebx
test ebx, ebx
jne .read_loop
.read_loop_break:


pop ds


; return
mov ecx, [ebp + 8]
mov eax, esi
sub eax, ecx
jmp .return
.return_err:
sub dx, 6
in al, dx
or eax, 0xffffff00
.return:
popf
pop ebx
pop esi
pop ebp
ret

ata_port_bases:
dw 0x1f0
dw 0x3f0
dw 0x170
dw 0x370
dw 0x1e8
dw 0x3e0
dw 0x168
dw 0x360


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 июл 2017, 17:45 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Можно, почему нет то? Выбрали мастер/ слев. Затем пишете колличество секторов потом LBA. Далее снова пишети в тежи самые порты по второму кругу колличество секторов и LBA. Они как FIFO работают. Вначале пишете старшие адресса, затем младшие.

Только у вас код неправельный. Надо сектора вычитывать целиком, а не пополовинке. И писать также.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 июл 2017, 11:52 

Зарегистрирован: 04 сен 2016, 02:49
Сообщения: 6
А можете показать где код нужно исправить или правильный код. у вас подозрение вызывает вот эта часть
Код:
mov ecx, 0x100
rep insw

256 слов это 512 байт, в виртуалбоксе проверял читает и пишет 512 байт, и еще в какие два регистра мне нужно разбивать uint64_t lbasec переменную из Си содерж. 48 битный адрес lba, если нужен полностью другой то можете выложить ваш код для Lba-48 на асме и как его использовать для функции си .


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2017, 18:09 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Мне лень всё править.

Цитата:
; set specified drive & lba on & bits 24-27 of lba address
mov al, cl
and al, 1
shl al, 4
or al, 0xe0
mov ecx, [ebp + 16]
shr ecx, 24
and cl, 0xf
or al, cl

out dx, al

; set bits 32-63 of sector count
sub dx, 4
mov eax, [ebp + 24+4]
out dx, al

; set bits 24-47 of lba address
inc dx
mov eax, [ebp + 16+3]
out dx, al
shr eax, 8
inc dx
out dx, al
shr eax, 8
inc dx
out dx, al

; FIFO next sec, lba
dec dx,3
; set ишеы 0-31 sector count
mov eax, [ebp + 24]
out dx, al

; set bits 0-23 of lba address
inc dx
mov eax, [ebp + 16]
out dx, al
shr eax, 8
inc dx
out dx, al
shr eax, 8
inc dx
out dx, al


и остальные ebp надо поправить


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB