РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ linux

85
РАБОТА С ВНЕШНИМИ РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ УСТРОЙСТВАМИ LINUX LINUX

Upload: ludwig

Post on 12-Jan-2016

61 views

Category:

Documents


0 download

DESCRIPTION

РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ LINUX. Классы устройств и модулей. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

РАБОТА С РАБОТА С ВНЕШНИМИ ВНЕШНИМИ

УСТРОЙСТВАМИ УСТРОЙСТВАМИ LINUXLINUX

Page 2: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Классы устройств и Классы устройств и модулеймодулей

Linux разделяет все устройства на три основных Linux разделяет все устройства на три основных типа. Каждый модуль, как правило, реализует типа. Каждый модуль, как правило, реализует функциональность одного из этих типов и отсюда функциональность одного из этих типов и отсюда может классифицироваться как символьный может классифицироваться как символьный модуль, блочный модуль или сетевой модуль. модуль, блочный модуль или сетевой модуль. Ниже приводятся краткие описания этих трех Ниже приводятся краткие описания этих трех классов: классов:

Символьные устройстваСимвольные устройства Символьное устройство - устройство, которое Символьное устройство - устройство, которое

поставляет данные как поток байтов. Драйвер поставляет данные как поток байтов. Драйвер символьного устройства отвечает за реализацию символьного устройства отвечает за реализацию поддержки такого поведения. Такие драйверы поддержки такого поведения. Такие драйверы реализуют как минимум четыре системных реализуют как минимум четыре системных вызова: open, close, write и read. Примеры таких вызова: open, close, write и read. Примеры таких устройств - текстовая консоль (/dev/console) и устройств - текстовая консоль (/dev/console) и последовательный порт (/dev/ttyS*). последовательный порт (/dev/ttyS*).

Page 3: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Классы устройств и Классы устройств и модулеймодулей

К символьным устройствам можно обращаться К символьным устройствам можно обращаться посредством элементов файловой системы. посредством элементов файловой системы. Важное отличие обычных файлов от символьных Важное отличие обычных файлов от символьных устройств заключается в том, что программа устройств заключается в том, что программа может перемещаться по файлам вперёд и может перемещаться по файлам вперёд и назад, в то время как символьные устройства назад, в то время как символьные устройства это лишь каналы передачи данных, доступ к это лишь каналы передачи данных, доступ к которым осуществляется в заданном порядке. которым осуществляется в заданном порядке.

Блочные устройстваБлочные устройства К блочным устройствам так же можно К блочным устройствам так же можно

обращаться посредством элементов файловой обращаться посредством элементов файловой системы в каталоге /dev. Примером блочного системы в каталоге /dev. Примером блочного устройства может служить жёсткий диск. устройства может служить жёсткий диск. Обмен данными с блочным устройством Обмен данными с блочным устройством производится порциями байт - блоками. производится порциями байт - блоками.

Page 4: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Классы устройств и Классы устройств и модулеймодулей

В большинстве Linux-систем размер одного блока В большинстве Linux-систем размер одного блока равен 1 килобайту или другому числу, равен 1 килобайту или другому числу, являющемуся степенью числа 2. Linux позволяет являющемуся степенью числа 2. Linux позволяет приложениям обращаться к блочному устройству приложениям обращаться к блочному устройству так же как к символьному он разрешает так же как к символьному он разрешает передачу любого числа байт в блоке. В результате, передачу любого числа байт в блоке. В результате, все различие между блочными и символьными все различие между блочными и символьными устройствами сводится к внутреннему устройствами сводится к внутреннему представлению данных в ядре. Драйвер блочного представлению данных в ядре. Драйвер блочного устройства реализует точно такой же интерфейс с устройства реализует точно такой же интерфейс с ядром, что и драйвер символьного устройства, но ядром, что и драйвер символьного устройства, но дополнительно реализуется еще и блочно-дополнительно реализуется еще и блочно-ориентированный интерфейс, который "невидим" ориентированный интерфейс, который "невидим" для пользователя или приложения, которые для пользователя или приложения, которые открывают доступ к блочному устройству открывают доступ к блочному устройству посредством псевдофайловой системы /dev. посредством псевдофайловой системы /dev.

Page 5: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Классы устройств и Классы устройств и модулеймодулей

Сетевые интерфейсыСетевые интерфейсы Любой сетевой обмен выполняется через сетевой Любой сетевой обмен выполняется через сетевой

интерфейс, то есть устройство, которое способно интерфейс, то есть устройство, которое способно обмениваться данными с другими узлами сети. обмениваться данными с другими узлами сети. Как правило, это аппаратное устройство, но Как правило, это аппаратное устройство, но возможна и программная реализация сетевого возможна и программная реализация сетевого устройства, например петлевое устройство устройства, например петлевое устройство loopback. Сетевой интерфейс отвечает за loopback. Сетевой интерфейс отвечает за передачу и получение пакетов данных, которыми передачу и получение пакетов данных, которыми управляет сетевая подсистема ядра, не зная о управляет сетевая подсистема ядра, не зная о том, к каким соединениям эти пакеты том, к каким соединениям эти пакеты принадлежат. Не смотря на то, что соединения по принадлежат. Не смотря на то, что соединения по протоколам Telnet и FTP используют один и тот протоколам Telnet и FTP используют один и тот же сетевой интерфейс, само устройство не же сетевой интерфейс, само устройство не различает эти соединения, оно "видит" только различает эти соединения, оно "видит" только пакеты данных. пакеты данных.

Page 6: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Классы устройств и Классы устройств и модулеймодулей

Файловые системыФайловые системы Кроме драйверов устройств, самым важным Кроме драйверов устройств, самым важным

классом модулей в Linux являются файловые классом модулей в Linux являются файловые системы. Тип файловой системы обусловливает системы. Тип файловой системы обусловливает способ организации информации на блочном способ организации информации на блочном устройстве, это программный драйвер, потому что устройстве, это программный драйвер, потому что он отображает структуры данных нижнего уровня он отображает структуры данных нижнего уровня на структуры данных верхнего уровня. Файловая на структуры данных верхнего уровня. Файловая система определяет какой длины могут быть система определяет какой длины могут быть имена файлов и какая информация о каждом из имена файлов и какая информация о каждом из файлов должна храниться. Файловая система файлов должна храниться. Файловая система должна реализовать самый нижний уровень должна реализовать самый нижний уровень системных вызовов для доступа к каталогам и системных вызовов для доступа к каталогам и файлам, путем отображения их имён (и иной файлам, путем отображения их имён (и иной информации, такой как права доступа и пр.) в информации, такой как права доступа и пр.) в структуры данных, которые записываются в блоки структуры данных, которые записываются в блоки данных. данных.

Page 7: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем ЧастоЧасто требуется засекать время выполнения требуется засекать время выполнения

программы, это можно сделать с помощью программы, это можно сделать с помощью разных методов, но все они базируются на разных методов, но все они базируются на прерываниях от таймера. Прерывания от прерываниях от таймера. Прерывания от таймера представляют собой механизм, таймера представляют собой механизм, используемый ядром для получения используемый ядром для получения требуемых интервалов времени. Прерывания требуемых интервалов времени. Прерывания представляют собой асинхронные события, представляют собой асинхронные события, которые обычно генерируются каким-либо которые обычно генерируются каким-либо внешним физическим устройством. При этом внешним физическим устройством. При этом CPU прерывает исполнение своей текущей CPU прерывает исполнение своей текущей задачи, и начинает исполнять специальный задачи, и начинает исполнять специальный код обработчика прерывания. код обработчика прерывания.

Page 8: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Прерывания таймера генерируются специальным Прерывания таймера генерируются специальным

системным электронным компонентом через системным электронным компонентом через равные заданные промежутки времени. Значение равные заданные промежутки времени. Значение интервала времени устанавливается ядром, интервала времени устанавливается ядром, измеряется в Гц, является архитектурно-измеряется в Гц, является архитектурно-зависимым, и определено в заголовочном файле зависимым, и определено в заголовочном файле <linux/param.h> макроопределением HZ. <linux/param.h> макроопределением HZ. Современный Linux, на большинстве платформ, Современный Linux, на большинстве платформ, использует прерывания с частотой 100 Гц. использует прерывания с частотой 100 Гц. Некоторый платформы используют значение 1024 Некоторый платформы используют значение 1024 Гц. Гц.

Каждый раз, когда возникает прерывание от Каждый раз, когда возникает прерывание от таймера, инкрементируется значение переменной таймера, инкрементируется значение переменной jiffies. jiffies инициализируется нулем при загрузке jiffies. jiffies инициализируется нулем при загрузке системы, и, таким образом, показывает количество системы, и, таким образом, показывает количество тиков таймера с момента включения компьютера.тиков таймера с момента включения компьютера.

Page 9: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Можно изменить значение интервала таймера Можно изменить значение интервала таймера

изменением макроопределения HZ, это можно изменением макроопределения HZ, это можно использовать при решении задач реального времени, использовать при решении задач реального времени, но это приведет к увеличению общей доли времени, но это приведет к увеличению общей доли времени, которое тратится на обработку прерывания таймера. которое тратится на обработку прерывания таймера.

Процессоро-зависимые регистрыПроцессоро-зависимые регистры Если необходимо измерить очень короткие Если необходимо измерить очень короткие

интервалы времени, или требуется высокая точность интервалы времени, или требуется высокая точность измерения, можно использовать платформо-измерения, можно использовать платформо-зависимые ресурсы, выбирая точность против зависимые ресурсы, выбирая точность против портируемости результирующего кода. портируемости результирующего кода.

Большинство современных CPU содержат в себе Большинство современных CPU содержат в себе счетчик, значение которого инкрементируется с счетчик, значение которого инкрементируется с каждым тактом процессора. Такой счетчик может каждым тактом процессора. Такой счетчик может быть использован для точного измерения быть использован для точного измерения интервалов времени. интервалов времени.

Page 10: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Учитывая свойственную большинству систем Учитывая свойственную большинству систем

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

Наиболее известным регистром счетчиком Наиболее известным регистром счетчиком является регистр TSC (timestamp counter), является регистр TSC (timestamp counter), представленный в семействе процессоров x86 представленный в семействе процессоров x86 начиная с процессора Pentium. Это 64-битный начиная с процессора Pentium. Это 64-битный регистр, который считает такты CPU. Он может регистр, который считает такты CPU. Он может быть прочитан как из пространства ядра, так и быть прочитан как из пространства ядра, так и из пространства пользователя. из пространства пользователя.

Page 11: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Включив заголовочный файл <asm/msr.h> Включив заголовочный файл <asm/msr.h>

(machine-specific registers), можно (machine-specific registers), можно использовать следующие макросы: использовать следующие макросы:

rdtsc(low,high);rdtsc(low,high); rdtscl(low);rdtscl(low); С помощью первого макроса можно прочитать С помощью первого макроса можно прочитать

64-битное значение счетчика в две 32-битовые 64-битное значение счетчика в две 32-битовые переменные. Второй макрос читает младшую переменные. Второй макрос читает младшую половину регистра в 32-х битовую половину регистра в 32-х битовую переменную, и является достаточным в переменную, и является достаточным в большинстве случаев. Например, на 500 МГц большинстве случаев. Например, на 500 МГц процессоре переполнение 32-х битового процессоре переполнение 32-х битового счетчика будет происходить каждые 8.5 счетчика будет происходить каждые 8.5 секунд. секунд.

Page 12: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Заголовки ядра включают и архитектурно-Заголовки ядра включают и архитектурно-

независимую функцию, скрывающую независимую функцию, скрывающую существующие различия реализации, и существующие различия реализации, и которую можно использовать вместо rdtsc(). которую можно использовать вместо rdtsc(). Она называется get_cycles() (определена в Она называется get_cycles() (определена в <asm/timex.h>). Её прототип:<asm/timex.h>). Её прототип:

#include <linux/timex.h> #include <linux/timex.h> cycles_t get_cycles( void );cycles_t get_cycles( void ); Эта функция определена для любой Эта функция определена для любой

платформы, и она всегда возвращает нулевое платформы, и она всегда возвращает нулевое значение на платформах, которые не имеют значение на платформах, которые не имеют реализации регистра счётчика циклов. Тип реализации регистра счётчика циклов. Тип cycles_t является соответствующим cycles_t является соответствующим целочисленным типом без знака для хранения целочисленным типом без знака для хранения считанного значения. считанного значения.

Page 13: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Такой выбор емкости означает, например, что на

процессорах Pentium функция get_cycles() возвратит только младшие 32 бит реального счетчика процессорных тиков. Это позволит избежать многорегистровых операций, и не воспрепятствует цели наиболее частого использования счетчика - измерение коротких интервалов времени.

Примечание:Примечание: Нулевое значение, возвращаемое Нулевое значение, возвращаемое get_cycles() на платформах, не предоставляющих get_cycles() на платформах, не предоставляющих соответствующей реализации, делает возможным соответствующей реализации, делает возможным обеспечить переносимость между аппаратными обеспечить переносимость между аппаратными платформами тщательно прописанного кода (там, платформами тщательно прописанного кода (там, где это есть, используется get_cycles(), а там, где где это есть, используется get_cycles(), а там, где этой возможности нет, тот же код реализуется, этой возможности нет, тот же код реализуется, опираясь на последовательность системных опираясь на последовательность системных тиков). тиков).

Page 14: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Функция do_gettimeofday()Функция do_gettimeofday() Если драйверу необходимо текущее время, Если драйверу необходимо текущее время,

можно воспользоваться функцией можно воспользоваться функцией do_gettimeofday(). Она заполняет экземпляр do_gettimeofday(). Она заполняет экземпляр структуры timeval, переданный в функцию по структуры timeval, переданный в функцию по указателю, с использованием значений секунд и указателю, с использованием значений секунд и микросекунд. Для пространства пользователя микросекунд. Для пространства пользователя существует аналогичный системный вызов существует аналогичный системный вызов gettimeofday(). Прототип для функции gettimeofday(). Прототип для функции do_gettimeofday() выглядит следующим образом: do_gettimeofday() выглядит следующим образом:

#include <linux/time.h>#include <linux/time.h> void do_gettimeofday(struct timeval *tv);void do_gettimeofday(struct timeval *tv); Функция do_gettimeofday() имеет "разрешение в Функция do_gettimeofday() имеет "разрешение в

пределах микросекунды" для многих пределах микросекунды" для многих архитектурах. архитектурах.

Page 15: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Системный вызов times()Системный вызов times() Каждый процесс может пребывать в двух Каждый процесс может пребывать в двух

фазах: системной (внутри тела системного фазах: системной (внутри тела системного вызова - его выполняет для нас ядро вызова - его выполняет для нас ядро операционной системы) и пользовательской операционной системы) и пользовательской (внутри кода самой программы). Время, (внутри кода самой программы). Время, затраченное процессом в каждой фазе, может затраченное процессом в каждой фазе, может быть измеряно системным вызовом times(). быть измеряно системным вызовом times(). Кроме того, этот вызов позволяет узнать Кроме того, этот вызов позволяет узнать суммарное время, затраченное порожденными суммарное время, затраченное порожденными процессами [2]. процессами [2].

Системный вызов заполняет структуруСистемный вызов заполняет структуру struct tms { clock_t tms_utime; clock_t struct tms { clock_t tms_utime; clock_t tms_stime; clock_t tms_cutime; clock_t tms_stime; clock_t tms_cutime; clock_t tms_cstime; };tms_cstime; };

Page 16: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа со временемРабота со временем Все времена измеряются в "тиках" - некоторых Все времена измеряются в "тиках" - некоторых

долях секунды. Число тиков в секунде можно долях секунды. Число тиков в секунде можно узнать таким системным вызовом:узнать таким системным вызовом:

clock_t HZ = sysconf(_SC_CLK_TCK);clock_t HZ = sysconf(_SC_CLK_TCK); Поля структуры содержат:Поля структуры содержат: tms_utime(tms_cutime) - время, затраченное tms_utime(tms_cutime) - время, затраченное

вызывающим(порожденным) процессом в вызывающим(порожденным) процессом в пользовательской фазе, пользовательской фазе,

tms_stime(tms_cstime) - время, затраченное tms_stime(tms_cstime) - время, затраченное вызывающим(порожденным) процессом в вызывающим(порожденным) процессом в системной фазе. системной фазе.

real_time - время, соответствующее real_time - время, соответствующее астрономическому времени системы. Если нужно астрономическому времени системы. Если нужно засечь интервал времени выполнения программы, засечь интервал времени выполнения программы, то имеет смысл мерять только их разность.то имеет смысл мерять только их разность.

Page 17: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с внешними Работа с внешними устройствами в ОС устройствами в ОС LinuxLinux

Метод ioctl()Метод ioctl() Данный метод работает через файловый Данный метод работает через файловый

дескриптор. В него передается целое число, дескриптор. В него передается целое число, символизирующее запрашиваемую команду, и символизирующее запрашиваемую команду, и другие аргументы, обычно – указатель. другие аргументы, обычно – указатель. Преимущества этого метода перед другими: Преимущества этого метода перед другими: если необходимо выполнять обработку если необходимо выполнять обработку полученных из драйвера данных прежде, чем полученных из драйвера данных прежде, чем они будут выведены на экран, то получение они будут выведены на экран, то получение данных в бинарной форме более эффективна, данных в бинарной форме более эффективна, нежели их извлечение из текстового файла нежели их извлечение из текстового файла /proc; получение данных через ioctl() не связано /proc; получение данных через ioctl() не связано со страничной фрагментацией; является со страничной фрагментацией; является возможность оставления команд получающих возможность оставления команд получающих отладочную информацию после отладки.отладочную информацию после отладки.

Page 18: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с внешними Работа с внешними устройствами в ОС устройствами в ОС LinuxLinux

Вызов функции ioctl() в пользовательском Вызов функции ioctl() в пользовательском процессе определяется следующим прототипом : процессе определяется следующим прототипом :

int ioctl(int fd, int cmd, ...);int ioctl(int fd, int cmd, ...); Действительный тип третьего аргумента зависит Действительный тип третьего аргумента зависит

от передаваемой в процедуру команды, которая от передаваемой в процедуру команды, которая определяется вторым аргументом. Некоторые определяется вторым аргументом. Некоторые команды не имеют аргументов, некоторые команды не имеют аргументов, некоторые используют целый аргумент, а некоторые берут в используют целый аргумент, а некоторые берут в качестве аргумента указатель на структуру качестве аргумента указатель на структуру данных. данных.

С другой стороны, функция ioctl() драйвера С другой стороны, функция ioctl() драйвера получает аргументы согласно следующему получает аргументы согласно следующему объявлению: объявлению:

int (*ioctl) (struct inode *inode, struct file int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);*filp, unsigned int cmd, unsigned long arg);

Page 19: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с внешними Работа с внешними устройствами в ОС устройствами в ОС LinuxLinux

Указатели inode и filp представляют собой Указатели inode и filp представляют собой значения соответствующие файловому значения соответствующие файловому дескриптору fd, переданному дескриптору fd, переданному пользовательским процессом, и полностью пользовательским процессом, и полностью совпадают с параметрами, передаваемыми в совпадают с параметрами, передаваемыми в системный вызов open(). Аргумент cmd системный вызов open(). Аргумент cmd передается от пользователя неизменным, а передается от пользователя неизменным, а необязательный аргумент arg передается в необязательный аргумент arg передается в форме unsigned long, что может форме unsigned long, что может соответствовать как целому значению, так и соответствовать как целому значению, так и указателю. Если вызывающая программа не указателю. Если вызывающая программа не передает третий аргумент, то значение arg передает третий аргумент, то значение arg имеет неопределенное значение. имеет неопределенное значение.

Page 20: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с внешними Работа с внешними устройствами в ОС устройствами в ОС LinuxLinux

Управление устройством через esc-Управление устройством через esc-последовательностипоследовательности

Управление некоторыми устройствами удачнее Управление некоторыми устройствами удачнее реализуется через запись управляющей реализуется через запись управляющей последовательности в само устройство. Такая последовательности в само устройство. Такая техника, например, используется для драйвера техника, например, используется для драйвера консоли, в который передаются, так называемые консоли, в который передаются, так называемые esc-последовательности, используемые для esc-последовательности, используемые для перемещения курсора, изменения цвета, и перемещения курсора, изменения цвета, и выполнения других конфигурационных задач. выполнения других конфигурационных задач. Выгода такого способа управления заключается в Выгода такого способа управления заключается в том, что пользователи, имеющие права на запись том, что пользователи, имеющие права на запись в устройство могут участвовать в управлении им в устройство могут участвовать в управлении им не приобретая специальных привилегий, и не не приобретая специальных привилегий, и не используя специальных программ, реализующих используя специальных программ, реализующих ioctl() вызовы. ioctl() вызовы.

Page 21: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с внешними Работа с внешними устройствами в ОС устройствами в ОС LinuxLinux

Например, программа setterm управляет Например, программа setterm управляет конфигурацией консоли передачей esc-конфигурацией консоли передачей esc-последовательностей. Дополнительным последовательностей. Дополнительным преимуществом такого управления является преимуществом такого управления является простота удаленного управления устройством. простота удаленного управления устройством. Управляющая программа и управляемое устройство Управляющая программа и управляемое устройство могут размещаться на разных компьютерах, т.к. могут размещаться на разных компьютерах, т.к. управление может осуществляться простым управление может осуществляться простым перенаправлением потока данных. перенаправлением потока данных.

Неприятной стороной такого управления Неприятной стороной такого управления устройством являются дополнительные устройством являются дополнительные ограничения по управлению устройством. ограничения по управлению устройством. Например, управляющие последовательности не Например, управляющие последовательности не должны оказаться внутри потока данных должны оказаться внутри потока данных передаваемых в устройство. Это справедливо и для передаваемых в устройство. Это справедливо и для tty. tty.

Page 22: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с внешними Работа с внешними устройствами в ОС устройствами в ОС LinuxLinux

Несмотря на то, что текстовый дисплей Несмотря на то, что текстовый дисплей предназначен для отображения только символов предназначен для отображения только символов ASCII, иногда, в потоке передаваемых данных, ASCII, иногда, в потоке передаваемых данных, могут оказаться управляющие символы, влияющие могут оказаться управляющие символы, влияющие на настройку консоли.на настройку консоли.

Использование файловой системы /procИспользование файловой системы /proc Файловая система /proc представляет собой Файловая система /proc представляет собой

специальную, программно-реализованную специальную, программно-реализованную файловую систему, которая связана с функциями файловую систему, которая связана с функциями ядра, которые генерируют содержание файла во ядра, которые генерируют содержание файла во время чтения. Например /proc/modules, который время чтения. Например /proc/modules, который возвращает список загруженных, в данный возвращает список загруженных, в данный момент модулей и /proc/meminfo, который момент модулей и /proc/meminfo, который содержит статистику использования содержит статистику использования памяти. Файловая система /proc широко памяти. Файловая система /proc широко используется в Linux-системе. используется в Linux-системе.

Page 23: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с внешними Работа с внешними устройствами в ОС устройствами в ОС LinuxLinux

Многие утилиты современных Linux-дистрибутивов, Многие утилиты современных Linux-дистрибутивов, такие как ps, top и uptime получают свою такие как ps, top и uptime получают свою информацию из /proc. Некоторые драйвера информацию из /proc. Некоторые драйвера устройств, также используют /proc для передачи устройств, также используют /proc для передачи информации в пространство пользователя. информации в пространство пользователя. Файловая система /proc является динамической Файловая система /proc является динамической системой, и модуль может добавлять и удалять системой, и модуль может добавлять и удалять файловый элемент из этой системы во время своей файловый элемент из этой системы во время своей работы. работы.

Метод использования файловой системы /proc Метод использования файловой системы /proc похож на работу с драйверами устройства: похож на работу с драйверами устройства: создается структура со всей информацией, создается структура со всей информацией, необходимой для /proc файла, включая указатели необходимой для /proc файла, включая указатели на любые функции драйвера. Размер файла равен на любые функции драйвера. Размер файла равен нулю потому что содержание файла генерируется нулю потому что содержание файла генерируется ядром, файл нельзя запустить. Время модификации ядром, файл нельзя запустить. Время модификации данного файла – текущее время. данного файла – текущее время.

Page 24: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Для программирования задач управления Для программирования задач управления данными устройствами требуются данными устройствами требуются соответствующие библиотеки. Рассмотрим соответствующие библиотеки. Рассмотрим пакеты, в которые они входят.пакеты, в которые они входят.

Пакет PCI Utilities-3.1.8Пакет PCI Utilities-3.1.8 Пакет PCI Utilities является набором программ, Пакет PCI Utilities является набором программ,

предназначенным для выдачи списка предназначенным для выдачи списка устройств PCI, проверки состояния устройств и устройств PCI, проверки состояния устройств и настройки их конфигурационных регистров.настройки их конфигурационных регистров.

Информация о пакете. Информация о пакете. Загрузка: Загрузка: ftpftp://://atrey.karlin.mff.cuni.czatrey.karlin.mff.cuni.cz//pubpub//linuxlinux//pcipci//pciutils-3.1.8.tar.gz//pciutils-3.1.8.tar.gz

Page 25: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Размер загружаемого пакета: 372 KB Размер загружаемого пакета: 372 KB Оценочный размер требуемого дискового Оценочный размер требуемого дискового

пространства: 3,5 MB пространства: 3,5 MB Замечания для пользователей: Замечания для пользователей: httphttp://://

wiki.linuxfromscratch.orgwiki.linuxfromscratch.org//blfsblfs//wikiwiki//pciutilspciutils Установка пакета PCI UtilitiesУстановка пакета PCI Utilities Установите пакет PCI Utilities с помощью Установите пакет PCI Utilities с помощью

следующих команд:следующих команд: make PREFIX=/usr ZLIB=no В этом пакете набор make PREFIX=/usr ZLIB=no В этом пакете набор

тестов отсутствует.тестов отсутствует.

Page 26: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Теперь в роли пользователя root выполните:Теперь в роли пользователя root выполните: make PREFIX=/usr install Некоторые пакеты make PREFIX=/usr install Некоторые пакеты

требуют статической библиотеки PCI. Чтобы требуют статической библиотеки PCI. Чтобы установить библиотеку и заголовки, установить библиотеку и заголовки, выполните в роли пользователя root выполните в роли пользователя root следующую команду:следующую команду:

make PREFIX=/usr install-libmake PREFIX=/usr install-lib ПояснениеПояснение командыкоманды

ZLIB=no: Этот параметр предотвращает ZLIB=no: Этот параметр предотвращает сжатие файла pci.ids, который необходимо для сжатие файла pci.ids, который необходимо для других приложений, например, других приложений, например, HAL-0.5.14HAL-0.5.14..

Page 27: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Конфигурирование пакета PCI UtilitiesКонфигурирование пакета PCI Utilities Файл данных pci.ids постоянно обновляется. Файл данных pci.ids постоянно обновляется.

Чтобы получить текущую версию этого файла, Чтобы получить текущую версию этого файла, выполните в роли пользователя root команду выполните в роли пользователя root команду update-pciidsupdate-pciids. Для этой программы требуется . Для этой программы требуется скрипт скрипт Which-2.20Which-2.20 или программа, которая или программа, которая ищет ищет cURL-7.22.0cURL-7.22.0, , Wget-1.13.4Wget-1.13.4 или или Lynx-2.8.7rel.2Lynx-2.8.7rel.2, используемые для загрузки , используемые для загрузки самого нового текущего файла, а затем самого нового текущего файла, а затем замены им файла, находящегося в /usr/share.замены им файла, находящегося в /usr/share.

Page 28: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Установленные программы:Установленные программы: lspci, setpci и lspci, setpci и update-pciids update-pciids

Установленные библиотеки:Установленные библиотеки: libpci.a libpci.a Установленные директории:Установленные директории: /usr/include/pci /usr/include/pci Краткое описание:Краткое описание: Lspci Lspci - это утилита для отображения

информации о всех шинах PCI, имеющихся в системе, и всех устройств, подключенных к ним.

Setpci - Setpci - это утилита для запросов к устройствам PCI и их конфигурирования.

Page 29: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Пример: setpci –v -s 07:00.0 F4.B=FF – 07:00.0 F4.B=FF – установить максимальную яркость монитора установить максимальную яркость монитора сигналом с видеокарты. сигналом с видеокарты.

Ключи: Ключи: -v verbose -v verbose (подробный отчет)(подробный отчет), -s site , -s site (domain:bus:slot.func), -D demo(domain:bus:slot.func), -D demo (не выполнять). (не выполнять).

Команды: регистр.тип=значение. Типы: Команды: регистр.тип=значение. Типы: Byte, Byte, Word, Long.Word, Long.

Получить список регистров: Получить список регистров: setpci - -dumpregssetpci - -dumpregs Возможна сборка программы управления Возможна сборка программы управления

конкретным устройством из исходных кодов.конкретным устройством из исходных кодов. Пример кода – здесь.Пример кода – здесь.

update-pciids -update-pciids -выдает текущую версию списка PCI ID. Требует Which-2.20, cURL-7.22.0, Wget-1.13.4 или Lynx-2.8.7rel.2

Page 30: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

libpci.a - libpci.a - является статической библиотекой, которая позволяет приложениям получать доступ к подсистеме PCI.

Пакет usbutils-004 В пакете usbutils находится утилита,

используемая для отображения информации о шинах USB, имеющихся в системе, и устройствах, подключенных к ним.

Информация о пакете. Загрузка (HTTP): http://ftp.de.debian.org/debian/pool/main/u/usbutils/usbutils_004.orig.tar.bz2z

Page 31: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Размер загружаемого пакета: 472 KB Оценочный размер требуемого дискового

пространства: 4,5 MB Зависимости пакета usbutils.

Обязательные: libusb-1.0.8 Замечания для пользователей: http://

wiki.linuxfromscratch.org/blfs/wiki/usbutils Установка пакета usbutils Установите пакет usbutils с помощью

следующих команд:

Page 32: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

./configure --prefix=/usr --disable-zlib &&make В этом пакете набор тестов отсутствует.

Теперь в роли пользователя root выполните: make install &&mv -v /usr/sbin/update-

usbids.sh /usr/sbin/update-usbids Пояснение команды

--disable-zlib: Этот параметр указывает пакету usbutils не устанавливать файл usb.ids ни в

сжатом, ни в распакованном виде.

Page 33: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Конфигурирование пакета usbutils Файл данных usb.ids постоянно обновляется.

Чтобы получить текущую версию этого файла, выполните в роли пользователя root команду update-usbids. Для этой программы требуется скрипт Which-2.20 или программа, которая ищет cURL-7.22.0, Wget-1.13.4 или Lynx-2.8.7rel.2, используемые для загрузки самого нового текущего файла, а затем замены им файла, находящегося в /usr/share.

Page 34: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Описание пакета Установленные программы: lsusb, update-

usbids и usb-devices Установленные библиотеки: Нет Установленные директории: Нет Краткое описание Lsusb - это утилита для отображения

информации о всех шинах USB, имеющихся в системе, и всех устройств, подключенных к

ним.

Page 35: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

update-usbids - выдает текущую версию списка USB ID. Требует Which-2.20, cURL-7.22.0, Wget-1.13.4> или Lynx-2.8.7rel.2

usb-devices - это скрипт командной строки, который отображает подробную информацию о шинах USB и устройствах, подключенных к ним. Он используется, если в вашей системе недоступны /proc/bus/usb/devices.

Пакет libusb-1.0.8 В пакете libusb находится библиотека,

используемая некоторыми приложениями для доступа к устройствам USB.

Page 36: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Информация о пакете Загрузка (HTTP):

http://downloads.sourceforge.net/libusb/libusb-1.0.8.tar.bz2

Загрузка (FTP): ftp://anduin.linuxfromscratch.org/BLFS/svn/l/libusb-1.0.8.tar.bz2

Размер загружаемого пакета: 331 KB Оценочный размер требуемого дискового

пространства: 5 MB

Page 37: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Зависимости пакета libusb Необязательные (необходимы для сборки

документации по API) - Doxygen-1.7.5 Замечания для пользователей:

http://wiki.linuxfromscratch.org/blfs/wiki/libusb Установка пакета libusb Установите пакет libusb с помощью

следующих команд: ./configure --prefix=/usr &&make

Page 38: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Если установлен пакет Doxygen и вы хотите собрать документацию API, введите следующую команду:

make -C doc docs В этом пакете набор тестов отсутствует.

Теперь в роли пользователя root выполните: make install Если вы собрали документацию API,

установите ее в роли пользователя root с помощью следующих команд:

install -v -d -m755 /usr/share/doc/libusb-1.0.8/apidocs &&install -v -m644 doc/html/* \ /usr/share/doc/libusb-1.0.8/apidocs

Page 39: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Конфигурирование пакета Libusb Чтобы получить доступ к "настоящим"

устройствам USB (тем, которые драйвером запоминающих устройств не определяются как диск), в ядре должна быть соответствующая поддержка. Проверьте конфигурацию вашего ядра в меню Device Drivers => USB support => Support for Host-side USB (Драйвера устройств => Поддержка USB => Хост-поддержка USB). Там же вы можете выбрать для устройства USB любой аппаратный драйвер.

Page 40: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

Работа с устройствами Работа с устройствами PCI PCI и и USB USB в ОС в ОС LinuxLinux

Описание пакета Установленные программы: Нет Установленные библиотеки: libusb-1.0.{so,a} Установленные директории:

/usr/include/libusb-1.0 и /usr/share/doc/libusb-1.0.8

Краткое описание

libusb-1.0.{so,a} libusb-1.0.{so,a} - - библиотеки, в которой находятся функции C для доступа к аппаратным возможностям USB

Пример кода – здесь.Пример кода – здесь.

Page 41: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Опрос процессораОпрос процессора Задание:Задание: необходимо опросить процессор и необходимо опросить процессор и

вывести на экран информацию о его частоте в вывести на экран информацию о его частоте в мегагерцах, названии модели, идентификаторе мегагерцах, названии модели, идентификаторе производителя и размере кэша. Вывести на экран производителя и размере кэша. Вывести на экран время выполнения программы.время выполнения программы.

Краткие теоретические сведения:Краткие теоретические сведения: Для опроса процессора удобнее всего Для опроса процессора удобнее всего

воспользоваться файловой системой /воспользоваться файловой системой /proc proc описание которой приведено в пункте 4. описание которой приведено в пункте 4. Содержащаясь в /Содержащаясь в /procproc информация доступна для информация доступна для чтения человеку, но также ее можно извлечь чтения человеку, но также ее можно извлечь программным путем с помощью парсинга. В программным путем с помощью парсинга. В данном случае необходимо получить информацию данном случае необходимо получить информацию о процессоре, запустим /proc/cpuinfo командой о процессоре, запустим /proc/cpuinfo командой ##catcat /proc/ /proc/cpuinfocpuinfo

Page 42: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ на экране получим следующее сообщение:на экране получим следующее сообщение: processor : 0processor : 0 vendor_id : GenuineIntelvendor_id : GenuineIntel cpu family : 6cpu family : 6 model : 5model : 5 model name : Pentium II (Deschutes)model name : Pentium II (Deschutes) stepping : 2stepping : 2 cpu MHz : 400.913520cpu MHz : 400.913520 cache size : 512 KBcache size : 512 KB fdiv_bug : nofdiv_bug : no hlt_bug : nohlt_bug : no sep_bug : nosep_bug : no f00f_bug : nof00f_bug : no coma_bug : nocoma_bug : no

Page 43: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ fpu : yesfpu : yes fpu_exception : yesfpu_exception : yes cpuid level : 2cpuid level : 2 wp : yeswp : yes flags : fpu vme de pse tsc msr pae mce cx8 flags : fpu vme de pse tsc msr pae mce cx8

apic sepapic sep mtrr pge mca cmov pat pse36 mmx fxsrmtrr pge mca cmov pat pse36 mmx fxsr bogomips : 399.77bogomips : 399.77 Наилучший путь для получения информации из Наилучший путь для получения информации из

этого вывода – запись из файла в буфер и этого вывода – запись из файла в буфер и далее парсить в память используя функцию далее парсить в память используя функцию sscanfsscanf. Нужно помнить, что имена, семантика и . Нужно помнить, что имена, семантика и формат выводимых данных может измениться в формат выводимых данных может измениться в новых версиях ядра новых версиях ядра LinuxLinux. Поэтому при запуске . Поэтому при запуске программ нужно проверять содержание /программ нужно проверять содержание /procproc..

Page 44: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Методические указанияМетодические указания 1) Перед началом работы выполнить команду 1) Перед началом работы выполнить команду ##catcat / /procproc//cpuinfo cpuinfo и убедиться в названии и убедиться в названии

полей для тактовой частоты, идентификатора полей для тактовой частоты, идентификатора производителя и т.д.производителя и т.д.

2) В случае если используется текстовый 2) В случае если используется текстовый буфер, нужно делать проверку на его буфер, нужно делать проверку на его заполнение.заполнение.

3) В конце символьной строки нужно 3) В конце символьной строки нужно добавлять значение конца строки \0добавлять значение конца строки \0

4) Для работы с полученной информацией 4) Для работы с полученной информацией можно воспользоваться стандартными можно воспользоваться стандартными текстовыми функциями текстовыми функциями sscanfsscanf(), (), strstrstrstr() и т.д. () и т.д. Описание их можно найти по команде Описание их можно найти по команде manman..

Page 45: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ 5) Значение тактовой частоты процессора 5) Значение тактовой частоты процессора

дробное, поэтому при выводе информации на дробное, поэтому при выводе информации на экран нужно указать тип данных экран нужно указать тип данных float float с 3-4 с 3-4 знаками после запятой.знаками после запятой.

6) Засечь время выполнения программы 6) Засечь время выполнения программы можно любым из описанных выше способов.можно любым из описанных выше способов.

Код программы доступен Код программы доступен здесьздесь. .

Page 46: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Опрос и управление модемом Опрос и управление модемом

(последовательный порт)(последовательный порт) Задание:Задание: Необходимо сконфигурировать Необходимо сконфигурировать

последовательный порт, опросить модем, последовательный порт, опросить модем, послать ему последовательность послать ему последовательность ATAT-команд и -команд и вывести результат на экран. Вывести на экран вывести результат на экран. Вывести на экран время выполнения программы.время выполнения программы.

Краткие теоретические сведения:Краткие теоретические сведения: Последовательная передача подразумевает Последовательная передача подразумевает

передачу данных посылкой в один битпередачу данных посылкой в один бит и и применяется в большинстве сетевых устройств, применяется в большинстве сетевых устройств, клавиатурах, модемах и терминалах. клавиатурах, модемах и терминалах. Стандартный электрический интерфейс для Стандартный электрический интерфейс для последовательной передачи данных - RS-232. последовательной передачи данных - RS-232.

Page 47: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ LinuxLinux предоставляет доступ к последовательным предоставляет доступ к последовательным

портам через файлы устройств. Для доступа к портам через файлы устройств. Для доступа к последовательному порту необходимо открыть последовательному порту необходимо открыть соответствующий файл устройства. Каждый соответствующий файл устройства. Каждый последовательный порт в системе последовательный порт в системе LinuxLinux имеет имеет несколько файлов устройств (файлы в несколько файлов устройств (файлы в каталоге /dev/каталоге /dev/ttySttyS0, /dev/0, /dev/ttySttyS1 ) Для открытия 1 ) Для открытия используется функция open(): используется функция open():

fdfd = = openopen("/("/devdev//ttyfttyf1", 1", OO__RDWRRDWR | | OO__NOCTTYNOCTTY | | OO__NDELAYNDELAY););

При открытии устанавливаются два При открытии устанавливаются два дополнительных флага вместе с режимом дополнительных флага вместе с режимом чтение/запись: O_NOCTTY - программа не чтение/запись: O_NOCTTY - программа не является управляющим терминалом для этого является управляющим терминалом для этого порта. порта.

Page 48: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ O_NDELAY - программа не следит за состоянием O_NDELAY - программа не следит за состоянием

сигнала DCD (то есть что другой конец линии сигнала DCD (то есть что другой конец линии запущен). Если не установить этот флаг, то запущен). Если не установить этот флаг, то процесс не будет работать до тех пор пока на процесс не будет работать до тех пор пока на линии DCD не появится уровень space (off). линии DCD не появится уровень space (off).

Для записи данных в порт используется Для записи данных в порт используется системный вызов write()системный вызов write()

n = write(fd, "ATZ\r", 4);n = write(fd, "ATZ\r", 4); Функция write возвращает количество посланных Функция write возвращает количество посланных

байт или -1 при возникновении ошибки. байт или -1 при возникновении ошибки. В случае, если идет работа с портом в режиме В случае, если идет работа с портом в режиме

неструктурированного посимвольного обмена, неструктурированного посимвольного обмена, каждый системный вызов read() будет каждый каждый системный вызов read() будет каждый раз возвращать число прочитанных символов в раз возвращать число прочитанных символов в буфер ввода. буфер ввода.

Page 49: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Если в текущий момент нет символов доступных Если в текущий момент нет символов доступных

для чтения, вызов будет блокироваться до тех для чтения, вызов будет блокироваться до тех пор, пока не появятся символы для чтения, или пор, пока не появятся символы для чтения, или закончится счетчик таймаута, или обнаружится закончится счетчик таймаута, или обнаружится какая-нибудь ошибка. Функцию read можно какая-нибудь ошибка. Функцию read можно выполнить так, что она вернет управление выполнить так, что она вернет управление немедленно. немедленно.

fcntl(fd, F_SETFL, FNDELAY);fcntl(fd, F_SETFL, FNDELAY); Опция FNDELAY указывает функции read Опция FNDELAY указывает функции read

возвращать 0 если нет символов доступных для возвращать 0 если нет символов доступных для чтения из последовательного порта. чтения из последовательного порта.

Для закрытия последовательного порта нужно Для закрытия последовательного порта нужно использовать функцию close().использовать функцию close().

Конфигурирование последовательного порта Конфигурирование последовательного порта предполагает изменение определенных предполагает изменение определенных атрибутов.атрибутов.

Page 50: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Большинство систем поддерживает Большинство систем поддерживает

последовательный интерфейс POSIX для последовательный интерфейс POSIX для изменения параметров, таких как скорость изменения параметров, таких как скорость передачи, размер символов и т.д. передачи, размер символов и т.д.

Две наиболее важные функции POSIX: Две наиболее важные функции POSIX: tcgetattr()tcgetattr() и и tcsetattr()tcsetattr(). Они, . Они, соответственно, позволяют получить и соответственно, позволяют получить и установить терминальные атрибуты. установить терминальные атрибуты. Необходимо предоставить указатель на Необходимо предоставить указатель на структуру структуру termiostermios, которая содержит все , которая содержит все доступные опции для последовательного доступные опции для последовательного интерфейса. интерфейса.

Page 51: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ

c_cflag c_cflag Управляющие опции Управляющие опции

c_lflag c_lflag Опции линии Опции линии

c_iflag c_iflag Опции ввода Опции ввода

c_oflag c_oflag Опции вывода Опции вывода

c_cc c_cc Управляющие символы Управляющие символы

c_ispeec_ispeedd

Скорость ввода в бодах Скорость ввода в бодах

c_ospeec_ospeedd

Скорость вывода в бодах Скорость вывода в бодах

Поля структуры termios

Page 52: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Поле c_cflag управляет скоростью передачи данных, Поле c_cflag управляет скоростью передачи данных,

количеством битов данных, четностью, стоп-битами, количеством битов данных, четностью, стоп-битами, и установкой аппаратного управления потоком и установкой аппаратного управления потоком передачи данных. c_cflag содержит две опции, передачи данных. c_cflag содержит две опции, которые всегда должны быть установлены: CLOCAL и которые всегда должны быть установлены: CLOCAL и CREAD. Функции CREAD. Функции cfsetospeed()cfsetospeed() и и cfsetispeed()cfsetispeed() предназначены для установки скорости передачи предназначены для установки скорости передачи данных в структуре данных в структуре termiostermios. Функция . Функция tcgetattr()tcgetattr() заполняет структуру заполняет структуру termiostermios текущими установками текущими установками конфигурации последовательного порта. После конфигурации последовательного порта. После установки нужной конфигурации используется установки нужной конфигурации используется tcsetattr()tcsetattr(). Константа TCSANOW указывает, что все . Константа TCSANOW указывает, что все изменения вступают в силу немедленно. Также изменения вступают в силу немедленно. Также существуют другие константы для ожидания существуют другие константы для ожидания завершения операций ввода и вывода (TCSADRAIN), завершения операций ввода и вывода (TCSADRAIN), или для очистки буферов ввода и вывода или для очистки буферов ввода и вывода (TCSAFLUSH). (TCSAFLUSH).

Page 53: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Размер символов задается битами: Размер символов задается битами: options.c_cflag &= ~CSIZE; /* Маскирование options.c_cflag &= ~CSIZE; /* Маскирование

битов размера символов */битов размера символов */ options.c_cflag |= CS8; /* Установка 8 битов options.c_cflag |= CS8; /* Установка 8 битов

данных */данных */ Поле локального режима c_lflag управляет, Поле локального режима c_lflag управляет,

как вводимые символы будут обрабатываться как вводимые символы будут обрабатываться драйвером последовательного порта. В драйвером последовательного порта. В основном приходится конфигурировать поле основном приходится конфигурировать поле c_lflag для канонического или c_lflag для канонического или неканонического (raw) ввода. неканонического (raw) ввода.

Page 54: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ

ISIG ISIG Разрешить SIGINTR, SIGSUSP, Разрешить SIGINTR, SIGSUSP, SIGDSUSP, и SIGQUIT сигналы SIGDSUSP, и SIGQUIT сигналы

ICANON ICANON Разрешить канонический ввод Разрешить канонический ввод (иначе неканонический) (иначе неканонический)

ECHO ECHO Разрешить эхо вводимых Разрешить эхо вводимых символов символов

ECHOE ECHOE Символ эхо стирания как BS-SP-Символ эхо стирания как BS-SP-BS BS

NOFLSH NOFLSH Блокировка очистки приемных Блокировка очистки приемных буферов после символа буферов после символа прерывания или выхода прерывания или выхода

Константы для поля c_lflag

Page 55: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Выбор канонического ввода:Выбор канонического ввода: Канонический ввод - строчно-ориентированный. Канонический ввод - строчно-ориентированный.

Вводимые символы помещаются в буфер который Вводимые символы помещаются в буфер который может интерактивно редактироваться может интерактивно редактироваться пользователем до приема символа CR (carriage пользователем до приема символа CR (carriage return) или LF (line feed). При выборе этого режима return) или LF (line feed). При выборе этого режима нормально устанавливаете опции ICANON, ECHO и нормально устанавливаете опции ICANON, ECHO и ECHOE: options.c_lflag |= (ICANON | ECHO | ECHOE);ECHOE: options.c_lflag |= (ICANON | ECHO | ECHOE);

Выбор неканонического (Raw) ввода:Выбор неканонического (Raw) ввода: Неканонический ввод не обрабатывается. Неканонический ввод не обрабатывается.

Вводимый символ передается без изменений, так Вводимый символ передается без изменений, так как он был принят. В основном сбрасываете опции как он был принят. В основном сбрасываете опции ICANON, ECHO, ECHOE и ISIG приустановке ICANON, ECHO, ECHOE и ISIG приустановке неканонического ввода: неканонического ввода:

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

Page 56: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Опции ввода:Опции ввода: Поле опций ввода c_iflag управляет любой Поле опций ввода c_iflag управляет любой

обработкой ввода которая выполняется над обработкой ввода которая выполняется над символами принимаемыми из символами принимаемыми из последовательного порта. последовательного порта.

Константы для поля c_iflagКонстанты для поля c_iflag

INPCK INPCK Производить проверку на Производить проверку на четность четность

IGNPAIGNPAR R

Игнорировать проверка на Игнорировать проверка на четность четность

IGNCR IGNCR Игнорировать знак возврата Игнорировать знак возврата каретки каретки

Page 57: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Опции вывода:Опции вывода: Поле c_oflag содержит опции фильтрации Поле c_oflag содержит опции фильтрации

вывода. Так же как для режима ввода, можно вывода. Так же как для режима ввода, можно выбрать обработанный или не обработанный выбрать обработанный или не обработанный (raw) вывод данных. Обработанный вывод (raw) вывод данных. Обработанный вывод выбирается установкой опции OPOST в поле выбирается установкой опции OPOST в поле c_oflag: options.c_oflag |= OPOST; c_oflag: options.c_oflag |= OPOST;

Выбор необработанного (raw) вывода Выбор необработанного (raw) вывода устанавливается сбросом опции OPOST в поле устанавливается сбросом опции OPOST в поле c_oflag: options.c_oflag &= ~OPOST;c_oflag: options.c_oflag &= ~OPOST;

Когда опция OPOST сброшена, все остальные Когда опция OPOST сброшена, все остальные биты опций в поле c_oflag игнорируются. биты опций в поле c_oflag игнорируются.

Page 58: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Управляющие символы:Управляющие символы: Символьный массив c_cc содержит описания Символьный массив c_cc содержит описания

управляющих символов и параметры управляющих символов и параметры таймаутов. Константы объявлены для каждого таймаутов. Константы объявлены для каждого элемента этого массива: VINTR – прерывание, элемента этого массива: VINTR – прерывание, VQUIT – выход, VMIN - минимальное количество VQUIT – выход, VMIN - минимальное количество символов для чтения, VTIME - время ожидания символов для чтения, VTIME - время ожидания данных (десятые доли секунды)данных (десятые доли секунды)

Модем. Модем. Модемы - это устройства которые модулируют Модемы - это устройства которые модулируют

последовательные данные в частоты, которые последовательные данные в частоты, которые могут быть переданы по аналоговым линиям могут быть переданы по аналоговым линиям подобным телефонным линиям или кабелям TV подобным телефонным линиям или кабелям TV подключений.подключений.

Page 59: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Управление модемомУправление модемом Первый шаг в организации связи через модем - Первый шаг в организации связи через модем -

это открытие и конфигурирование порта для это открытие и конфигурирование порта для неструктурированного (raw) ввода, следующее неструктурированного (raw) ввода, следующее что необходимо сделать, это установить связь с что необходимо сделать, это установить связь с модемом. Наилучший способ сделать это модемом. Наилучший способ сделать это посылкой модему "AT" команды. Когда модем посылкой модему "AT" команды. Когда модем корректно подключен и включен, он будет корректно подключен и включен, он будет выдавать ответ "OK". выдавать ответ "OK".

Стандартные команды модемаСтандартные команды модема Большинство модемов использует множество Большинство модемов использует множество

"AT" команд, называемых так поскольку каждая "AT" команд, называемых так поскольку каждая команда начинается с символов "AT" и команда начинается с символов "AT" и сопровождается специфическими командами и сопровождается специфическими командами и символом возврата каретки. символом возврата каретки.

Page 60: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ После обработки команды модем будет После обработки команды модем будет

отвечать одним из нескольких текстовых отвечать одним из нескольких текстовых сообщений, в зависимости от команды. сообщений, в зависимости от команды.

ATD - ATD - НаборНабор номераномера (Dial A Number) (Dial A Number) Команда ATD производит набор указанного Команда ATD производит набор указанного

номера. В дополнение к цифрам и дефисам номера. В дополнение к цифрам и дефисам можете указать тип набора тональный ("T") можете указать тип набора тональный ("T") или импульсный ("P"), паузу на одну секунду или импульсный ("P"), паузу на одну секунду (","), и ожидание тональной посылки ("W"): (","), и ожидание тональной посылки ("W"):

Пример:Пример: ATDT 18008008008W1234,1,1234ATDT 18008008008W1234,1,1234

Page 61: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Модем ответит одним из следующих Модем ответит одним из следующих

сообщений:сообщений: NO DIALTONENO DIALTONE BUSYBUSY NO CARRIERNO CARRIER CONNECTCONNECT CONNECT baudCONNECT baud Из других команд модема отметим Из других команд модема отметим

следующие:следующие: ATH - Повесить трубку (Hang Up) ATH - Повесить трубку (Hang Up) ATZATZ - Сброс модема. - Сброс модема.

Page 62: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Методические указания:Методические указания: 1) Для функции 1) Для функции ioctl ioctl необходимо подключить необходимо подключить

библиотеку библиотеку syssys//ioctlioctl..hh , для работы с , для работы с последовательным портом библиотеку последовательным портом библиотеку termios.h, для получения кодов ощибок - termios.h, для получения кодов ощибок - errno.h, для управления файлами - fcntl.herrno.h, для управления файлами - fcntl.h

2) Для инициализации порта рекомендуется 2) Для инициализации порта рекомендуется написать отдельную функцию и потом написать отдельную функцию и потом вызывать ее перед передачей команд модему.вызывать ее перед передачей команд модему.

3) Перехватить ответ модема можно с 3) Перехватить ответ модема можно с помощью функций для работы со строками.помощью функций для работы со строками.

4) Необходимо отключить эхо ввода. Эхо 4) Необходимо отключить эхо ввода. Эхо ввода приведет к циклу обратной связи между ввода приведет к циклу обратной связи между модемом и компьютером. модемом и компьютером.

Page 63: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ 5) При отправлении команды модему, 5) При отправлении команды модему,

необходимо завершать их символом возврата необходимо завершать их символом возврата каретки (CR), а не символом новой строки (NL). каретки (CR), а не символом новой строки (NL). Символьная константа - "\r". Символьная константа - "\r".

6) Нужно убедиться, что используется 6) Нужно убедиться, что используется скорость передачи, которую поддерживает скорость передачи, которую поддерживает модем. Хотя многие модемы выполняют модем. Хотя многие модемы выполняют автоматическое определение скорости автоматическое определение скорости передачи, некоторые имеют ограничения передачи, некоторые имеют ограничения (общее ограничение 19.2kbps).(общее ограничение 19.2kbps).

7) Засечь время выполнения программы 7) Засечь время выполнения программы можно любым из описанных выше способов.можно любым из описанных выше способов.

Код программы приведен Код программы приведен здесьздесь. .

Page 64: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Опрос сетевой карты на шине PCIОпрос сетевой карты на шине PCI Задание: Задание: опросить сетевую карту на шине опросить сетевую карту на шине PCIPCI, ,

получить ее получить ее macmac-адрес.-адрес. Вывести на экран время выполнения программы.Вывести на экран время выполнения программы. Краткие теоретические сведения:Краткие теоретические сведения: Разработка шины PCI (Разработка шины PCI (Peripheral Component Peripheral Component

Interconnect busInterconnect bus) - шины для подсоединения ) - шины для подсоединения периферийных устройств - началась в 1991 году периферийных устройств - началась в 1991 году как внутренний проект корпорации Intel. как внутренний проект корпорации Intel. Разработчики Intel отказались от использования Разработчики Intel отказались от использования шины процессора и ввели еще одну шины процессора и ввели еще одну "антресольную" (mezzanine) шину. Благодаря "антресольную" (mezzanine) шину. Благодаря такому решению шина получилась процессоро-такому решению шина получилась процессоро-независимой, могла работать параллельно с шиной независимой, могла работать параллельно с шиной процессора, не обращаясь к ней за запросами, и, процессора, не обращаясь к ней за запросами, и, тем самым, снижая ее загрузку. тем самым, снижая ее загрузку.

Page 65: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Стандарт шины был объявлен открытым и передан Стандарт шины был объявлен открытым и передан

PCI Special Interest Group (www.pcisig.com), которая PCI Special Interest Group (www.pcisig.com), которая продолжила работу по совершенствованию шины. продолжила работу по совершенствованию шины.

Основные возможности шины следующие:Основные возможности шины следующие: - синхронный 32-х или 64-х разрядный обмен - синхронный 32-х или 64-х разрядный обмен

данными. При этом для уменьшения числа данными. При этом для уменьшения числа контактов (и стоимости) используется контактов (и стоимости) используется мультиплексирование, то есть адрес и данные мультиплексирование, то есть адрес и данные передаются по одним и тем же линиям.передаются по одним и тем же линиям.

- поддержка 5V и 3.3V логики. Частота 66MHz - поддержка 5V и 3.3V логики. Частота 66MHz поддерживается только 3.3V логикой.поддерживается только 3.3V логикой.

- частота работы шины 33MHz или 66MHz - частота работы шины 33MHz или 66MHz позволяет обеспечить широкий диапазон позволяет обеспечить широкий диапазон пропускных способностей (с использованием пропускных способностей (с использованием пакетного режима):пакетного режима):

Page 66: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ 132 МВ/сек при 32-bit/33MHz;132 МВ/сек при 32-bit/33MHz; 264 MB/сек при 32-bit/66MHz;264 MB/сек при 32-bit/66MHz; 264 MB/сек при 64-bit/33MHz;264 MB/сек при 64-bit/33MHz; 528 МВ/сек при 64-bit/66MHz.528 МВ/сек при 64-bit/66MHz. При этом для работы шины на частоте 66MHz При этом для работы шины на частоте 66MHz

необходимо, чтобы все периферийные необходимо, чтобы все периферийные устройства работали на этой частоте.устройства работали на этой частоте.

- полная поддержка multiply bus master - полная поддержка multiply bus master (например, несколько контроллеров жестких (например, несколько контроллеров жестких дисков могут одновременно работать на дисков могут одновременно работать на шине).шине).

- автоматическое конфигурирование карт - автоматическое конфигурирование карт расширения при включении питания.расширения при включении питания.

Page 67: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ - спецификация шины позволяет комбинировать до - спецификация шины позволяет комбинировать до

восьми функций на одной карте (например, видео + восьми функций на одной карте (например, видео + звук и т.д.).звук и т.д.).

- шина позволяет устанавливать до 4 слотов - шина позволяет устанавливать до 4 слотов расширения, однако возможно использование моста расширения, однако возможно использование моста PCI-PCI для увеличения количества карт расширения.PCI-PCI для увеличения количества карт расширения.

- PCI-устройства оборудованы таймером, который - PCI-устройства оборудованы таймером, который используется для определения максимального используется для определения максимального промежутка времени, в течении которого устройство промежутка времени, в течении которого устройство может занимать шину.может занимать шину.

Шина поддерживает метод передачи данных, Шина поддерживает метод передачи данных, называемый "linear burst" (метод линейных пакетов). называемый "linear burst" (метод линейных пакетов). Этот метод предполагает, что адрес автоматически Этот метод предполагает, что адрес автоматически увеличивается для следующего байта, при этом увеличивается для следующего байта, при этом увеличивается скорость передачи данных за счет увеличивается скорость передачи данных за счет уменьшения числа передаваемых адресов.уменьшения числа передаваемых адресов.

Page 68: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Согласно спецификации, каждое устройство PCI Согласно спецификации, каждое устройство PCI

имеет конфигурационное пространство размером имеет конфигурационное пространство размером 256 байт, в котором содержится информация о 256 байт, в котором содержится информация о самом устройстве и о ресурсах, занимаемых самом устройстве и о ресурсах, занимаемых устройством.устройством.

Получим мак-адрес сетевой платы, используя Получим мак-адрес сетевой платы, используя сокеты.сокеты.

Далее с помощью директивы функции Далее с помощью директивы функции ioctlioctl SIOCGIFHWADDR запишем мак-адрес в заранее SIOCGIFHWADDR запишем мак-адрес в заранее определенную структуру. определенную структуру.

Методические указанияМетодические указания 1) Для работы с сетевой картой рекомендуется 1) Для работы с сетевой картой рекомендуется

использовать сокеты, функции работы с памятью.использовать сокеты, функции работы с памятью. 2) Для функции 2) Для функции ioctl ioctl необходимо подключить необходимо подключить

библиотеку sys/библиотеку sys/ioctlioctl..hh , для работы с сокетами - , для работы с сокетами - библиотеку linux/библиотеку linux/ifif..h h и sys/socket.hи sys/socket.h

Page 69: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ 3) Описание функций 3) Описание функций socketsocket(), (), memsetmemset() и др. () и др.

можно посмотреть с помощью команды можно посмотреть с помощью команды manman.. 4) Локальный интерфейс, который через 4) Локальный интерфейс, который через

общую память эмулирует работу сетевой общую память эмулирует работу сетевой карты - eth0.карты - eth0.

5) Засечь время выполнения программы 5) Засечь время выполнения программы можно любым из описанных выше способов.можно любым из описанных выше способов.

Код программы приведен Код программы приведен здесьздесь. .

Page 70: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Опрос и управление CD-Опрос и управление CD-ROMROM Задание:Задание: опросить устройство опросить устройство cdcd--romrom, получить , получить

информацию о проигрываемом в данный момент информацию о проигрываемом в данный момент файле (номер трека, время проигрывания), файле (номер трека, время проигрывания), выдвинуть и задвинуть лоток выдвинуть и задвинуть лоток cdcd--romrom. Вывести на . Вывести на экран время выполнения программы.экран время выполнения программы.

Краткие теоретические сведения:Краткие теоретические сведения: Изначально лазерные компакт-диски Изначально лазерные компакт-диски

разрабатывались именно как носители разрабатывались именно как носители оцифрованного звука. Практически любое оцифрованного звука. Практически любое устройство чтения CD-ROM является по устройство чтения CD-ROM является по совместительству и плеером аудио CD и совместительству и плеером аудио CD и позволяет воспроизводить аудиодиски при позволяет воспроизводить аудиодиски при минимальном вмешательстве со стороны минимальном вмешательстве со стороны системы. системы.

Page 71: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Драйверы устройств чтения CD-ROM Драйверы устройств чтения CD-ROM

предоставляют как функции контроля предоставляют как функции контроля воспроизведения аудиодисков средствами, так воспроизведения аудиодисков средствами, так и функции непосредственного чтения и функции непосредственного чтения аудиоданных (эти функции используются в аудиоданных (эти функции используются в основном программами-рипперами (rippers)). В основном программами-рипперами (rippers)). В Linux интерфейс драйвера CD-ROM описан в Linux интерфейс драйвера CD-ROM описан в файле linux/cdrom.h. файле linux/cdrom.h.

Воспроизведение аудио CD.Воспроизведение аудио CD. Запись на любом компакт-диске состоит из Запись на любом компакт-диске состоит из

нескольких треков. Треки нумеруются начиная нескольких треков. Треки нумеруются начиная с нуля (трек 0 содержит оглавление диска). с нуля (трек 0 содержит оглавление диска). Номер трека не может превышать значение 99. Номер трека не может превышать значение 99. На аудио CD каждый музыкальный фрагмент На аудио CD каждый музыкальный фрагмент как правило записывается на отдельном треке. как правило записывается на отдельном треке.

Page 72: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ В определенных ситуациях одно произведение В определенных ситуациях одно произведение

может быть записано на нескольких треках, может быть записано на нескольких треках, или же наоборот, на одном треке может быть или же наоборот, на одном треке может быть записано несколько независимых фрагментов. записано несколько независимых фрагментов. Последний вариант применяется, когда число Последний вариант применяется, когда число фрагментов, которые необходимо записать на фрагментов, которые необходимо записать на диск, превышает 99. В этом случае, для диск, превышает 99. В этом случае, для различения фрагментов внутри одного трека различения фрагментов внутри одного трека используются индексы. На одном и том же используются индексы. На одном и том же диске могут быть записаны как аудио-данные, диске могут быть записаны как аудио-данные, так и другая информация. Перед так и другая информация. Перед воспроизведением трека с такого "смешанного" воспроизведением трека с такого "смешанного" диска следует проверять, является ли трек диска следует проверять, является ли трек аудио-треком или треком данных.аудио-треком или треком данных.

Page 73: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Запись на диске разбивается на фреймы. Запись на диске разбивается на фреймы.

Каждый фрейм содержит 2352 байта. Для Каждый фрейм содержит 2352 байта. Для обеспечения указанных стандартных обеспечения указанных стандартных характеристик цифровой записи чтение характеристик цифровой записи чтение данных должно выполняться со скоростью 75 данных должно выполняться со скоростью 75 фреймов в секунду (что соответствует фреймов в секунду (что соответствует однократной скорости чтения CD-ROM). С однократной скорости чтения CD-ROM). С фреймами связан один из форматов фреймами связан один из форматов адресации на аудио CD. Адресация адресации на аудио CD. Адресация осуществляется в единицах MSF - минуты, осуществляется в единицах MSF - минуты, секунды, фреймы - где фрейм можно секунды, фреймы - где фрейм можно рассматривать как 1/75 секунды. рассматривать как 1/75 секунды.

В нижеследующей таблице приводятся В нижеследующей таблице приводятся основные вызовы ioctl, связанные с основные вызовы ioctl, связанные с воспроизведением аудио CD.воспроизведением аудио CD.

Page 74: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Директивы Директивы ioctlioctl для для CDCD--romrom

Вызов Вызов Описание Описание Доп. Доп. параметр параметр

CDROM_DRIVECDROM_DRIVE_STATUS _STATUS

Получение Получение данных о данных о состоянии состоянии устройства устройства

константа константа CDSL_XXX CDSL_XXX

CDROM_DISC_ CDROM_DISC_ STATUS STATUS

Получение Получение данных о диске данных о диске

константа константа CDSL_XXX CDSL_XXX

CDROMREAD CDROMREAD TOCHDR TOCHDR

Чтение заголовка Чтение заголовка оглавления оглавления диска диска

структура структура cdrom_tochdrcdrom_tochdr

Page 75: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫВызов Вызов Описание Описание Доп. Доп.

параметр параметр CDROMREADTCDROMREADTOCENTRY OCENTRY

Чтение элемента Чтение элемента оглавления диска оглавления диска

структура структура cdrom_tocentry cdrom_tocentry

CDROMSUB CDROMSUB CHNL CHNL

Чтение данных о Чтение данных о параметрах параметрах воспроизведениявоспроизведения

структура структура cdrom_subchnl cdrom_subchnl

CDROMPLAY CDROMPLAY TRKIND, TRKIND, CDROMPLAY CDROMPLAY MSF MSF

Воспроизведение Воспроизведение аудиозаписи аудиозаписи

Структуры Структуры cdrom_ti и cdrom_ti и cdrom_msf cdrom_msf

Page 76: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫВызов Вызов Описание Описание Доп. Доп.

параметр параметр CDROMSTOP CDROMSTOP Остановка Остановка

воспроизведения воспроизведения значение 0 значение 0

CDROMPAUSE, CDROMPAUSE, CDROMRESUMCDROMRESUME E

Приостановка, Приостановка, возобновление возобновление воспроизведения воспроизведения

значение 0значение 0

CDROMEJECT CDROMEJECT Открытие лотка Открытие лотка устройства устройства

значение 0 значение 0

CDROMCLOSECDROMCLOSETRAY TRAY

Закрытие лотка Закрытие лотка устройства устройства

значение 0 значение 0

Page 77: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Вызовы CDROM_DRIVE_STATUS и Вызовы CDROM_DRIVE_STATUS и

CDROM_DISC_STATUS отличаются тем, что CDROM_DISC_STATUS отличаются тем, что результат возвращается не в параметре-ссылке, а результат возвращается не в параметре-ссылке, а как значение функции ioctl. В качестве третьего как значение функции ioctl. В качестве третьего аргумента ioctl выступает одна из констант, аргумента ioctl выступает одна из констант, определенных в файле cdrom.h. Эти константы определенных в файле cdrom.h. Эти константы предназначены для работы с устройствами предназначены для работы с устройствами автоматической смены компакт-дисков (CD автоматической смены компакт-дисков (CD changers). changers).

В случае "однодискового" устройства следует В случае "однодискового" устройства следует использовать CDSL_CURRENT. Результатом вызова использовать CDSL_CURRENT. Результатом вызова CDROM_DRIVE_STATUS могут быть значения CDROM_DRIVE_STATUS могут быть значения CDS_NO_DISC (нет диска в устройстве), CDS_NO_DISC (нет диска в устройстве), CDS_DRIVE_NOT_READY (устройство не готово), CDS_DRIVE_NOT_READY (устройство не готово), CDS_DISC_OK (диск обнаружен), а также CDS_DISC_OK (диск обнаружен), а также некоторые другие константы из файла cdrom.h. некоторые другие константы из файла cdrom.h.

Page 78: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Среди значений, возвращаемых вызовом Среди значений, возвращаемых вызовом

CDROM_DISC_STATUS следует отметить CDROM_DISC_STATUS следует отметить CDS_NO_DISC (нет диска в устройстве) CDS_NO_DISC (нет диска в устройстве) CDS_AUDIO (диск опознан как аудио) и CDS_AUDIO (диск опознан как аудио) и CDS_MIXED (диск опознан как "смешанный"). CDS_MIXED (диск опознан как "смешанный"). Остальные значения соответствуют не-Остальные значения соответствуют не-аудиодискам. аудиодискам.

Вызовы CDROMREADTOCHDR и Вызовы CDROMREADTOCHDR и CDROMREADTOCENTRY предназначены для CDROMREADTOCENTRY предназначены для работы с оглавлением диска. Вызов работы с оглавлением диска. Вызов CDROMREADTOCHDR позволяет получить данные CDROMREADTOCHDR позволяет получить данные о номере первого и последнего о номере первого и последнего информационных треков на диске, а вызов информационных треков на диске, а вызов CDROMREADTOCENTRY - данные об отдельном CDROMREADTOCENTRY - данные об отдельном треке - адрес начала трека (в формате MSF или треке - адрес начала трека (в формате MSF или LBA), тип трека (аудио или данные) и т.п. LBA), тип трека (аудио или данные) и т.п.

Page 79: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Вызов CDROMSUBCHNL позволяет получить Вызов CDROMSUBCHNL позволяет получить

информацию о текущем состоянии устройства - информацию о текущем состоянии устройства - находится ли диск в режиме воспроизведения, и в находится ли диск в режиме воспроизведения, и в какой позиции выполняется чтение данных.какой позиции выполняется чтение данных.

Вызовы CDROMPLAYTRKIND и CDROMPLAYMSF Вызовы CDROMPLAYTRKIND и CDROMPLAYMSF запускают воспроизведение аудиозаписи. Первый запускают воспроизведение аудиозаписи. Первый вызов позволяет задать начало и конец вызов позволяет задать начало и конец воспроизводимого фрагмента значениями воспроизводимого фрагмента значениями трек/индекс, второй - адресами в формате MSF. трек/индекс, второй - адресами в формате MSF. Поскольку оглавление диска содержит данные о Поскольку оглавление диска содержит данные о начальных адресах треков, воспроизведение начальных адресах треков, воспроизведение отдельного трека часто выполняется по принципу отдельного трека часто выполняется по принципу "от начала данного трека до начала следующего". "от начала данного трека до начала следующего". В файле cdrom.h определена константа В файле cdrom.h определена константа CDROM_LEADOUT, указывающая на условный трек, CDROM_LEADOUT, указывающая на условный трек, расположенный после последнего трека.расположенный после последнего трека.

Page 80: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Вызовы CDROMSTOP, CDROMPAUSE и Вызовы CDROMSTOP, CDROMPAUSE и

CDROMRESUME выполняют, соответственно, CDROMRESUME выполняют, соответственно, остановку, временную остановку (пауза) и остановку, временную остановку (пауза) и возобновление воспроизведения.возобновление воспроизведения.

Методические указанияМетодические указания 1) Для функции 1) Для функции ioctl ioctl необходимо подключить необходимо подключить

библиотеку sys/библиотеку sys/ioctlioctl..hh , для работы с файлами , для работы с файлами заголовочный файл заголовочный файл syssys//fcntlfcntl..h h для работы с для работы с CDCD--ROMROM - библиотеку linux/ - библиотеку linux/cdromcdrom..hh

2) Для получения информации используйте 2) Для получения информации используйте стандартные структуры, определенные в стандартные структуры, определенные в cdromcdrom..h h

3) Обратите внимание, что такие функции как 3) Обратите внимание, что такие функции как открытие лотка открытие лотка CDrom CDrom в функции в функции ioctl ioctl не имеют не имеют третьего параметра.третьего параметра.

Код программы приведен Код программы приведен здесьздесь. .

Page 81: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Параллельный порт. Управление принтером.Параллельный порт. Управление принтером. Задание:Задание: опросить принтер через параллельный опросить принтер через параллельный

порт, вывести на печать произвольный текст, порт, вывести на печать произвольный текст, вывести на экран состояние системных регистров вывести на экран состояние системных регистров до и после печатидо и после печати

Краткие теоретические сведения:Краткие теоретические сведения: Порт параллельного интерфейса был введен в Порт параллельного интерфейса был введен в PCPC

для подключения принтера — LP'T-порт (для подключения принтера — LP'T-порт (Line Line PrinTerPrinTer — построчный принтер). — построчный принтер).

Адаптер параллельного интерфейса Адаптер параллельного интерфейса представляет собой набор регистров, представляет собой набор регистров, расположенных в пространстве ввода/вывода. расположенных в пространстве ввода/вывода. Регистры порта адресуются от носительно Регистры порта адресуются от носительно базового адреса порта, стандартными базового адреса порта, стандартными значениями которого являются 386значениями которого являются 386hh, 378, 378hh и 278h. и 278h.

Page 82: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Порт имеет внешнюю 8-битную шину дан ных, 5-Порт имеет внешнюю 8-битную шину дан ных, 5-

битную шину сигналов состояния и 4-битную шину битную шину сигналов состояния и 4-битную шину управляющих сигналов. управляющих сигналов. BIOSBIOS поддерживает до поддерживает до четырех LPT-портов своим сервисом — четырех LPT-портов своим сервисом — прерыванием прерыванием INTINT 17 17hh, обеспечивающим через них , обеспечивающим через них связь с принтерами по интерфейсу связь с принтерами по интерфейсу CentronicsCentronics. . Этим сервисом Этим сервисом BIOSBIOS осуществляет вывод символа, осуществляет вывод символа, инициа лизацию интерфейса и принтера, а также инициа лизацию интерфейса и принтера, а также опрос состояния принтера.опрос состояния принтера.

В Linux параллельным портам сопоставляются В Linux параллельным портам сопоставляются файлы /dev/lp0, /dev/lp1. файлы /dev/lp0, /dev/lp1.

Опрос регистров принтера и выдачу произвольной Опрос регистров принтера и выдачу произвольной информации на печать можно произвести информации на печать можно произвести несколькими способами, первый – использовать несколькими способами, первый – использовать функцию функцию ioctlioctl(), директивы для нее описаны в (), директивы для нее описаны в файле parport.hфайле parport.h

Page 83: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ PPWDATA – запись информации в параллельный PPWDATA – запись информации в параллельный

портпорт PPRCONTROL – контроль чтения из PPRCONTROL – контроль чтения из

параллельного портапараллельного портаPPRSTATUS - статус последней команды чтения PPRSTATUS - статус последней команды чтения из параллельного портаиз параллельного порта

Второй метод – непосредственная Второй метод – непосредственная запись/чтение в порт и из порта с помощью запись/чтение в порт и из порта с помощью следующих функций [9]:следующих функций [9]:

outb, outw, outl, outsb, outsw, outsl - функции outb, outw, outl, outsb, outsw, outsl - функции вывода данных в порт вывода данных в порт inb, inw, inl, insb, insw, insl - функции чтения inb, inw, inl, insb, insw, insl - функции чтения данных порта данных порта outb_p, outw_p, outl_p, inb_p, inw_p, inl_p - outb_p, outw_p, outl_p, inb_p, inw_p, inl_p - функции задержки ввода/вывода. функции задержки ввода/вывода.

Page 84: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Это семейство функций используется для Это семейство функций используется для

низкоуровневой работы с портами низкоуровневой работы с портами ввода/вывода. В основном, они предназначены ввода/вывода. В основном, они предназначены для использования внутри ядра, но могут быть для использования внутри ядра, но могут быть вызваны и пользовательской программой. Для вызваны и пользовательской программой. Для того, чтобы запросить у ядра разрешение того, чтобы запросить у ядра разрешение доступа к портам, нужно использовать доступа к портам, нужно использовать ioperm() или iopl(). Если этого не сделать, ioperm() или iopl(). Если этого не сделать, приложение получит сообщение об ошибке приложение получит сообщение об ошибке сегментации. Для печати можно использовать сегментации. Для печати можно использовать функцию функцию writewrite() : () : writewrite((fdfd,"\,"\nTestnTest\\rr",",sizeofsizeof("\("\nTestnTest\\rr")), аргументами которой являются ")), аргументами которой являются дескриптор устройства, сообщение и длина дескриптор устройства, сообщение и длина сообщения.   сообщения.  

Page 85: РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ  LINUX

ПРИМЕРЫПРИМЕРЫ Методические указанияМетодические указания 11) ) ДляДля функциифункции ioctl ioctl необходимонеобходимо подключитьподключить

библиотекубиблиотеку sys/ioctl.h, sys/ioctl.h, длядля работыработы сс параллельнымпараллельным портомпортом linux/ppdev.h, linux/parport.h, linux/ppdev.h, linux/parport.h, длядля прямойпрямой записизаписи / / чтениячтения – – заголовочныйзаголовочный файлфайл sys/io.h sys/io.h

2) Описания функций 2) Описания функций inbinb(), (), outboutb(), (), iopliopl() можно () можно посмотреть, используя команду посмотреть, используя команду manman..

3) При отправлении текста на печать, необходимо 3) При отправлении текста на печать, необходимо завершать его символом возврата каретки. завершать его символом возврата каретки. Символьная константа - "\r". Символьная константа - "\r".

5) В конце записи необходимо отправить в порт 5) В конце записи необходимо отправить в порт команду окончания печати 0xFFкоманду окончания печати 0xFF

6) Засечь время выполнения программы можно 6) Засечь время выполнения программы можно любым из описанных выше способов.любым из описанных выше способов.

Код программы приведен здесь. Код программы приведен здесь.