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

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

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

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

IT-новости

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

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

подробнее

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

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

подробнее

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

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

подробнее

 

Рисунок 2. Формат команды PLAY AUDIO

 

Описание полей командного пакета:

n  Starting Logical Block Address – логический номер сектора, с которого начинается воспроизведение. Байты номера сектора располагаются в обратном порядке, на что указывают аббревиатуры MSB (Most significant bit) и LSB (Least significant bit);

n  Transfer Length – длина воспроизводимого фрагмента в логических секторах.

Следующая функция формирует и посылает устройству пакетную команду PLAY AUDIO (полный листинг находится в файле RAW/play_audio.c):

void play_audio()

{

    __u8 cmd_buff[12];

 

/* Воспроизводим фрагмент размером 5000 секторов, начиная с 10-го */

    __u32 start_lba = 10; // стартовый сектор

    __u16 lba_len = 5000; // длина воспроизводимого участка

 

    memset((void *)cmd_buff, 0, 12);

    cmd_buff[0] = 0x45; // код команды PLAY AUDIO

 

/* Меняем порядок следования байт при помощи макроса  __swab32. Этот макрос определён в файле <linux/byteorder/swab.h> */

    start_lba = __swab32(start_lba);

    memcpy((void *)(cmd_buff + 2), (void *)&start_lba, 4);

    lba_len = __swab16(lba_len);

    memcpy((void *)(cmd_buff + 6), (void *)&lba_len, 2);

    send_packet_command(cmd_buff);

 

    return;

}

 

Следующий класс пакетных команд, который мы рассмотрим в данной статье, требует передачи данных от устройства к хосту в режиме PIO. Алгоритм выполнения таких команд следующий (см. п. 5.8, спецификация INF-8020i):

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

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

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

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

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

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

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

Функция send_packet_data_command() реализует этот алгоритм. Параметры функции – размер запрашиваемых данных и указатель на 12-байтный командный пакет:

int send_packet_data_command(__u16 data_len, __u8 *cmd_buff)

{

    int i;

    __u8 status = 0;

    __u16 port, a;

 

    port = 0x177;

 

/* Ожидаем сброса битов BSY и DRQ */

    for(;;) {

           do {

                 IN_P_B(status, port);

           } while(status & BSY);

           if(!(status & DRQ)) break;

    }

 

/* Выбираем устройство Secondary Master */

    port = 0x176;

    OUT_P_B(0xA0, port);

 

/* В младший байт счетчика байтов (CL) заносим размер запрашиваемых данных */

    port = 0x174; OUT_P_W(data_len, port);

 

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

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

 

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

    for(;;) {

           do {

                 IN_P_B(status, port);

           } while(status & BSY);

           if(status & DRQ) break;

    }


Предыдущая страницаОглавлениеСледующая страница
 
[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 - 2023 год
Нижний Новгород, ул. Дальняя, 17А.
Rambler's Top100