Разработка динамических сайтов
SEO услуги
Управление контекстной рекламой

Вход на хостинг

Имя пользователя:*

Пароль пользователя:*

IT-новости

20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла

Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......

подробнее

30.07.2015 Ищем уникальный контент для сайта

Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......

подробнее

11.05.2015 Распространённые ошибки разработчиков сайтов

Не секрет, что в сети Интернет насчитывается миллионы сайтов, и каждый день появляются тысячси новых......

подробнее

 

Рисунок 1. Формат команды START/STOP UNIT

Формат этой команды простой. Поле Operation code содержит код команды 0x1B, а тип требуемой операции задают бит LoEj и Start:

LoEj

Start

Действие

1

0

открыть лоток CD-ROM

1

1

закрыть лоток CD-ROM

 

Команда START/STOP UNIT относится к классу пакетных команд, не требующих передачи данных (Non-data Commands). Алгоритм выполнения таких команд следующий (см. п. 5.13, спецификация INF-8020i):

n  хост считывает регистр состояния устройства, дожидаясь нулевого значения битов BSY и DRQ. После этого хост заносит в регистр выбора устройство байт, бит DEV которого указывает на адресуемое устройство;

n  хост записывает код пакетной команды 0xA0 в командный регистр;

n  устройство устанавливает бит BSY в регистре состояния и готовится к приёму пакетной команды;

n  подготовившись к приёму пакетной команды, устройство сбрасывает бит BSY и устанавливает бит DRQ;

n  хост записывает 12-байтный командный пакет в регистр данных устройства;

n  устройство устанавливает бит BSY и приступает к выполнению поступившей команды. После выполнения команды устройство сбрасывает бит BSY, DRQ и устанавливает бит DRDY;

n  хост считывает регистр состояния.

Рассмотрим листинг программы, выполняющей открытие и закрытие лотка CD-ROM (файл RAW/atapi_o_c.c).

Биты регистра состояния SR и макроопределения для работы с портами:

#define BSY 0x80

#define DRQ 0x08

#define DRDY 0x40

 

#define OUT_P_B(val,port) __asm__("outb %%al, %%dx"::"a"(val),"d"(port))

 

#define OUT_P_W(val,port) __asm__("outw %%ax, %%dx"::"a"(val),"d"(port))

 

#define IN_P_B(val,port) __asm__("inb %%dx, %%al":"=a"(val):"d"(port))

 

#define IN_P_W(val,port) __asm__("inw %%dx, %%ax":"=a"(val):"d"(port))

Функция send_packet_command реализует алгоритм выполнения пакетных команд, не требующих передачи данных. Входные параметры функции – указатель на 12-байтный командный пакет:

void send_packet_command(__u8 *cmd_buff)

{

    int i;

    __u8 status = 0;

    __u16 port, a;

 

    port = 0x177; // регистр состояния SR

 

/* В соответствии с алгоритмом ждем нулевого значения  битов BSY и DRQ */

 

for(;;) {

    do {

           IN_P_B(status, port);

    } while(status & BSY);

    if(!(status & DRQ)) break;

}

 

/* Выбираем устройство Master и в его регистр команд записываем код пакетной команды */

          

    port = 0x176; OUT_P_B(0xA0, port); // бит DEV сброшен

    port = 0x177; OUT_P_B(0xA0, port);

 

/* Ждём сброса бита BSY и установки DRQ */

    for(;;) {

           do {

                 IN_P_B(status, port);

           } while(status & BSY);

           if(status & DRQ) break;

    }

 

    port = 0x170; // регистр данных

 


Предыдущая страницаОглавлениеСледующая страница
 
[001] [002] [003] [004] [005] [006] [007] [008] [009] [010] [011] [012] [013] [014] [015] [016] [017] [018] [019] [020]
[021] [022] [023] [024] [025] [026] [027] [028] [029] [030] [031] [032] [033] [034] [035] [036] [037] [038] [039] [040]
[041] [042] [043] [044] [045] [046] [047] [048] [049] [050] [051] [052] [053] [054] [055] [056] [057] [058] [059] [060]
[061] [062] [063] [064] [065] [066] [067] [068] [069] [070] [071] [072] [073] [074] [075] [076] [077] [078] [079] [080]
[081] [082] [083] [084] [085] [086] [087] [088] [089] [090] [091] [092] [093] [094] [095] [096] [097] [098] [099] [100]
[101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120]
[121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140]
[141] [142] [143] [144] [145] [146] [147] [148] [149] [150] [151] [152] [153] [154] [155] [156] [157] [158] [159] [160]
[161]

+7 (831) 413-63-27
ООО Дельта-Технология ©2007 - 2016 год
Нижний Новгород, ул. Дальняя, 17А.
Rambler's Top100