Как написать драйвер для клавиатуры

Цитата
Сообщение от ФедосеевПавел
Посмотреть сообщение

По аппаратному цепляется русификатор (драйвер) клавиатуры

да мне бы хотелось аппаратное прерывание, оно же быстрее должно срабатывать наверно? А без прицепления русификатора тоже можно (чисто по кнопке) или обязательно с русификатором?

Добавлено через 5 минут

Цитата
Сообщение от Kukuxumushu
Посмотреть сообщение

@@:jmp @b * * ; бесконечный цикл простоя

в моем коде нет вот этого простоя, этот код нужен, так получается? Т.е механизм драйвера такой: происходит подмена вектора прерывания и комп зависает (ждет это прерывание)? Но ведь такой метки нет , на которую указывает ссылка безусловного перехода @b?

Что происходит с процессором в этот момент?

Добавлено через 4 минуты
Мне казалось что аппаратный драйвер это некая резидентная программа, которая постоянно находится в оперативной памяти компьютера, и которая при первом запуске подменяет вектор прерывания и код вызываемой программы постоянно находится в оперативной памяти. И по нажатию «нужной» кнопки процессор сразу обращается к этому коду? А так получается что процессор подвисает?

Добавлено через 21 минуту

Цитата
Сообщение от Kukuxumushu
Посмотреть сообщение

И переходите уже на FASM, а то долго мучиться будете.

Чем fasm лучше Masm он не правильно компилирует код? С ошибками, вы имеете в виду, и поэтому может не пойти?

Добавлено через 1 час 31 минуту

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.MODEL tiny
.386
.DATA
.CODE
org 100h
START:
STI ; разрешаю аппаратные прерывания
mov al,11111101b ;запрещаю все прерывания кроме прерываний от клавиатуры
out 21h,al
mov    ax,2509h           ; объявляю вектор прерывания клавиатуры для подмены адреса прерывания
mov    dx,perem          ; задаю адрес смещения для кода выполнения аппаратного прерывания
int 21h     ;заменяю вектор прерывания клавиатуры с системного на свой
@@: jmp @b
perem:
    mov al,'0'     ; начало кода для выполнения по срабатыванию нажатой клавиши
        int 29h
    mov al,'1'
        int 29h
    mov al,' '
        int 29h    ; окончание кода по срабатыванию прерывания
    mov   al,20h     ; указание процессору что текущее нажатие кнопки обработано и нужный код по прерыванию выполнился
    out   20h,al     ; указание процессору, что бы он ждал следующее нажатие кнопки и запустил бы снова свой код (10 )          
END START

указание не явного адреса на код выполняемой программы в строке 11 по ссылке perem нормально отработал, спасибо это я не понял, конечно так проще. А вот добавление строки 13 практически ничего не дало, единственно что программа не проходит до конца вниз, а останавливается на этом переходе. (раньше проходила во конца и выводила один раз на экран код 0,1, пробел. И потом еще срабатывала один раз по нажатию кнопки , в результате сколько бы не нажималась кнопка выходило 01 01 и все , теперь выходит 01 , что еще можно подправить в коде? Может быть добавить безусловный переход после 22 строки на 13ю? Где находится сейчас процессор после срабатывания кнопки на первое нажатие ? Регистр IP равен строке начала программы обработки прерывания (на 15й строке) . Дос в отладчике в этот момент пишет Program terminated normally. Что программа завершилась нормально, значит правильно, Дос понял что программа должна запуститься только один раз и не собирается ее запускать еще повторно?

Добавлено через 5 минут

Цитата
Сообщение от R71MT
Посмотреть сообщение

твоё нажатие клавиши, не даёт спокойно жить APIC

какое отношение APIS имеет к старому компу архитектуры 80386 на котором я провожу испытание Досовой программы? PS. APIC использовался в многоядерных/многопроцессорных системах, начиная с Intel Pentium (ядро P54). из вики.

Добавлено через 2 минуты

Цитата
Сообщение от R71MT
Посмотреть сообщение

Поставь терминал, и чтоб он тебе выдавал по-каждому нажатию клавиши по штуке баксов.

ну может так и будет, во первых бакс скоро рухнет, а во вторых модуль моей программы тоже будет сколько то стоить может быть как раз бакс, пока не знаю…

Добавлено через 3 минуты

Цитата
Сообщение от R71MT
Посмотреть сообщение

Клава самый основной ингредиент компа. IRQ1 о многом говорит

да именно по этому я и пишу для нее код, пока мысль у вас верная… Но программа все равно не работает, в чем причина, я думаю надо идти в сторону резидентных программ под Досом да? Поскольку она выполняется один раз и Дос пишет, все отлично я свою задачу выполнил, а на самом деле он ошибся, не такая была у него задача…

Добавлено через 4 минуты
еще наверно имеет смысл в отладчике посмотреть адреса векторов аппаратных прерываний и посмотреть какой адрес стоит в смещении 4* 9 =36 , там должен стоять адрес строки 15 кода программы у текущего сегмента, да?

Добавлено через 5 часов 36 минут
Вот нашел совет

Завершение программы прерыванием 27H оставляет ее резидентной в памяти.

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

Добавлено через 3 минуты
А в каком месте кода программы надо ставить

?

Добавлено через 8 минут
Вот еще как можно, но тоже не работает Оставить программу резидентной можно с помощью функции 31H прерывания 21H

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

Какой должна быть клавиатура по моему мнению:

  1. Белая. Потому что в сумерках её лучше видно при отсутствующей подсветке.

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

  3. Устойчивость к попаданию влаги.

  4. Память на подсветку. Она не должна сбрасываться после выключения компьютера. Раздражает ежедневный одинаковый ритуал тыкания по несколько раз на 2 кнопки после каждого включения. Причём сначала настраиваешь цвет, потом яркость.

  5. Отключение подсветки одним нажатием, если оставляешь компьютер работать на ночь. И включение с сохранением настроек, а не как на многих клавиатурах сейчас. Когда ты уже сонный – бесит искать FN+»где она там блин».

  6. Только проводная. Ну или объясните, какой смысл в бессмысленных и беспощадных беспроводных? Ходить с ними по офису, как с переносным музыкальным синтезатором на ремне через плечо? Всё равно в итоге их нужно подзаряжать по проводу. Только этот провод нужно сначала найти с момента прошлой зарядки. Вон он упал за стол – тянись теперь. И так, пока не издохнет аккумулятор или не расшатаете гнездо зарядки. Не получается клавиатура «На века». Никак.

  7. Русская раскладка должна быть тоже с подсветкой. Потому что нестираемые клавиши китайцы предлагают иногда и непрозрачные, через которые не проникает свет. Лазерная гравировка. В таком случае светятся только латинские буквы. А разница всего чуть дешевле. При заказе больших партий контейнерами может и есть экономия ребёнку на мороженное, но мы себя уважаем и таки закажем нормальную клаву.

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

  9. Клавиатура должна быть качественной и надёжной. Механической. NKRO и ARGB.

Это странно, но почему-то до сих пор никто не сделал такой драйвер для клавиатуры

Клавиатуру найти можно. Китайцы сделают любую. Даже твоё имя на ней бесплатно нарисуют. Или за 50 баксов. Но драйвер так никто написать и не удосужился. Есть куча программ, которые не совсем удобно и коряво пытаются заменить часть упомянутого функционала. Вот те, которые стоят у меня:

  • AutoHotkey

  • MapKeyboard

  • ClipDiary

  • PuntoSwitcher

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

Вторая хорошо отключает ненужные клавиши. До неё я просто физически выдирал их из клавиатуры и она потом походила на улыбку бомжа. Самая ненавидимая мной клавиша – конечно Insert. Сколько же она перепортила нужного текста, который не нужно было удалять! У новых клавиатур я её всегда выдирал первой. Месть. С этой программой мои клавиатуры теперь выглядят аккуратно. Но иногда мне нужен, например, TAB или F11. А чтоб включить отключённые этой прогой клавиши обратно, нужно выйти из учётной записи Windows и войти обратно. Зато программа универсальна и подходит для разных клавиатур.

Вот почему нужен драйвер

Чтоб не было таких неудобств, нужно делать низкоуровневый драйвер. А такой уже ко всем клавиатурам не подойдёт. Нужно заказывать несколько образцов по несколько штук каждой клавиатуры с запасом, если вдруг разраб драйвера запорет первый экземпляр. А несколько разных моделей нужно, чтоб вы с программистом решили, какая подойдёт лучше. Остальные либо останутся валяться ждать своего часа, либо их можно будет продать на маркетплейсах с другим своим товаром. У меня на маркетплейсы дорожка протоптана.

Дамы и господа, если вы знаете, что кто-то сделал нечто подобное – дайте координаты. Закрою свой проект и буду радостно покупать клавиатуры там. Потому что для мышей производители выпускают программы настройки с GUI и запоминанием настроек, а для клавиатур почему-то нет. У меня для мыша сейчас стоит X7 Oscar Editor.

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

Как я пытался решать проблему

Низкоуровневые драйверы обычно пишутся на C со вставками Ассемблера или просто на Ассемблере. Ну, думаю, тряхну стариной. Освоил же Спектрум-Бейсик в 90х и HTML 15 лет назад. Поглядел, что такое Ассемблер. Да, в 90х мне это казалось чем-то очень сложным.

Сейчас мало что изменилось. Он до сих пор сложный. Я его буду учить года 3, не меньше. Он работает напрямую с железом. Это как получать новую профессию. Легче заплатить, чем тратить годы. Мне нужна моя новая клавиатура, а не новая профессия. Подростком бы я взялся. Я сутки потратил на первые попавшиеся уроки Ассемблера с нуля, которые оказались для Линукса. Ещё около полутора суток я не мог вывести «Привет, мир» на кириллице. Все авторы видеоуроков сначала медленно разжёвывают знакомые со времён ZX-Spectrum азы, затем у них кончается терпение и более сложный материал они уже тараторят так, что хрен поймёшь.

Решил найти разработчика

Товарищи, подскажите хорошего дешёвого разраба. Тот, которого нашёл я, прямым текстом заявил, что «да, это работа на несколько десятков часов, её можно сделать за 1-2 недели плюс отладка по мелочи и вся работа столько не стоит, сколько я за неё прошу. Но мне надо кормить себя и своих детей, потому я назвал ценник раза в 4 дороже».

Потому что последнее время программистов не хватает и они борзеют. Многие конторы ввалили ценник в десятки тысяч долларов только потому, что они «дешевле не работают». Джуны вместо стипендии получают зарплаты мастеров на заводе.

Со всеми расходами на того жадного разработчика клавиатура под ключ выходит под 8 тысяч рублей при заказе 135 штук. Дешевле него никто цену не назвал. Мне сразу что-то расхотелось платить такие деньги из своего кармана без гарантии продаж. Я бы взял такую клавиатуру и за 10 тысяч. Продайте – куплю. Наверняка найдутся и другие раздражённые неудобствами дядечки, которых бесит отсутствие функционала из техзадания. Я разместил проект на краудфандинговой платформе «Планета». Функционал там расписан подробно. Если по стране наберётся хотя-бы 135 человек таких же, как я – будет драйвер и я разошлю клавиатуры всем предзаказавшим. «Планета» выплачивает деньги при достижении 50% сборов, потому я увеличил сумму проекта в 2 раза. Наберётся 270 человек – ещё и заработаю.

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

НАВЕКАРУС™

Название придумалось от слов «На века», потому что за границей его будут читать латиницей как «Habeka» заглавными буквами без кириллицы. Пойдут продажи в России – сделаем такие драйвера под другие страны. Потом добавился домен .рус – так и получился «Навекарус». Звучно. И плевать, что похоже на «Икарус».

Как планировалось вначале

Сначала я хотел дополнительные 4 клавиши над клавишами курсора. Вот такие.

Чтоб вызывать самые нужные функции одной кнопкой и чтоб эти кнопки случайно не нажимались. Они ниже остальных. Этот прибабах при подсчёте китайцами вылился бы в $5000 в довесок к драйверному хапуге. Потому по умолчанию их пока заменят клавиши курсора + Ctrl, FN или Alt. А там сами выберете в настройках, что чем будете вызывать. Когда-нибудь я закажу партию с кнопками мечты, как я их видел изначально. И с другими пожеланиями пользователей.

Почему опять китайцы?

Кто знает вменяемых массовых производителей клавиатур из России – отзовитесь. Потому что да, производители в России есть. Там за одно проектирование берут 2 млн. Не помню, это цена уже с формами или без – но при любом стартапе нужно обходиться малой кровью. Под ключ вроде выходило около 5 млн руб с новым дизайном и драйвером. Там на каждый отдел по несколько дизайнеров, проектировщиков, инженеров и тд. Нереально для мини-старта. Почему у китайцев это стоит 375000 рублей ($5000), а у нас – 2 млн? Я этих китайцев уже боюсь. Слишком мощные. Заказал китайский паяльный набор – он в розницу на маркетплейсе стоил 1400 рублей. Там слишком много всего для такой низкой цены. Опробовал – работает. Не сгорел. Там и без паяльника всё должно дороже стоить. Плюс сумочка-упаковка. Плюс перевозка с растаможкой, плюс наценка продавца плюс доля маркетплейсу. Это страшно. У США и близко нет такой экономики. Американцы насчитали себе в плюс бороду деривативов и гордятся первым местом в мире. А на деле давно отстают от Китая.

Только не нужно ныть в комментариях про политику и экономику. Ноют те, кто сам никогда ничего толком не делал. Надо свой завод строить. К этому и будем стремиться. После клавиатур закажу нормальный телевизор. Оказывается, с 1990х телевизоры сильно деградировали и у меня к ним много вопросов. Я много лет не смотрю ТВ, предыдущий у меня был аж с ЭЛТ из тех самых 90х. Недавно я решил купить себе новый телек как второй монитор к компьютеру, чтоб смотреть скачанные сериалы и новогодние эфиры с большого экрана. Оказалось, телевизоры теперь хуже, чем в золотой век аудиокассет и компакт-дисков. Смарт-ТВ – вообще позорище. Вернул, заменил на нормальный. Главный вопрос: почему клавиши курсора на пульте теперь не управляют звуком и переключением каналов? Почему светодиод слепит ночью прожектором, а гнездо для наушников где-то сзади и хрен до него доберёшься? Почему наушники автоматически вырубают звук, если до гнезда так тяжело добраться? Ну сделали бы отключение на передней панели или с пульта.

Исправлю.

Нормальный разраб, найдись

Кто сделает драйвер для клавиатуры по адекватной цене? Обсудим разные формы сотрудничества. Пишите в личку. Туда же скидывайте производителей клавиатур на территории России. Я лучше заплачу русским, чем китайцам, если русские назовут адекватную стоимость.

И нужны идеи, что можно добавить к списку. Что постоянно мучает вас – а я не допёр? Клавиатуру с каким функционалом вы бы купили на маркетплейсе?


  1. Axel Coon

    Axel Coon

    New Member

    Публикаций:

    0

    Регистрация:
    9 ноя 2004
    Сообщения:
    7

    Для курсовой мне нужно написать драйвер клавиатуры под DOS, выполняющий полностью все функции стандартного драйвера. А что, вообще, он делает? Я думаю, описывает функции DOS(типа 0Ah и др.) для работы с клавиатурой, которые мне придётся написать самому с помощью портов ввода-вывода. Или я не прав? В принципе, я уже начал его писать, вот только что делать дальше не знаю, подскажите.

    [​IMG] _1964629256__KeyDrv.asm


  2. ProgramMan

    ProgramMan

    New Member

    Публикаций:

    0

    Регистрация:
    13 янв 2004
    Сообщения:
    263

    Почитай Зубкова, например.

    Вообшето в инете полно примеров.

    Примерно так это делается:

    1)забиваешь в памяти место

    2)копируешь туда обработчик

    3)Редактируешт IDT

    4) дальше в коде

    1обработчика читаешь коды клавишь через порты

    2посылаешь EIO контроллеру

    5)при необходимости для выхода, обнуляешь память, востонавливаешь IDT

    Если будуть срочные вопросы, можешь писать на аску ICQ : 220-078-640


  3. Axel Coon

    Axel Coon

    New Member

    Публикаций:

    0

    Регистрация:
    9 ноя 2004
    Сообщения:
    7

    У меня есть «Assembler для DOS, Windows и Unix», но там маловато — даже 15 страниц про драйвера нету. Может есть другие книжки, целеком посвящённые драйверам? Для Windows я видал такие, а для DOS нет.


  4. ProgramMan

    ProgramMan

    New Member

    Публикаций:

    0

    Регистрация:
    13 янв 2004
    Сообщения:
    263

    Смотри у Зубкова главу 5.8, 5.11 там есть примеры кода.

    Можешь ещё полистать tech60.


  5. ProgramMan

    ProgramMan

    New Member

    Публикаций:

    0

    Регистрация:
    13 янв 2004
    Сообщения:
    263

    Можно дизасемблить и помотреть стандартный DOS драйвер.


  6. krid24

    krid24

    Member

    Публикаций:

    0

    Регистрация:
    17 авг 2004
    Сообщения:
    78

    У Финогенова есть кой-чего на эту тему (в аттаче). Правда, не драйвер, а так — описание взаимодействия системы с клавой.

    [​IMG] 2139455631__rf51_53.zip


  7. LocTb

    LocTb

    New Member

    Публикаций:

    0

    Регистрация:
    11 окт 2004
    Сообщения:
    54

    ProgramMan

    3)Редактируешт IDT— DOS же, просто таблицу векторов прерываний, по DWORD’у на прерывание.


  8. ProgramMan

    ProgramMan

    New Member

    Публикаций:

    0

    Регистрация:
    13 янв 2004
    Сообщения:
    263

    LocTb, нда… бывает я уже давно под дос не писал


  9. Axel Coon

    Axel Coon

    New Member

    Публикаций:

    0

    Регистрация:
    9 ноя 2004
    Сообщения:
    7

    Спасибо за доку. Я от туда вот что вычитал:

    У меня есть драйвер консоли, может выкинуть из него всё что касается вывода и получится драйвер клавиатуры?

  10. Что касается драйверов (именно драйверов! которые подключаются в config.sys через device=), то поищи в библиотеке или в инете вот это:

    ———

    ББК 32.973.2-018

    Л92

    УДК 681.322-181.4

    Роберт Лэй

    Разработка драйверов устройств для MS-DOS

    Перевод с английского.

    Рязань: Versus Ltd. 1992 .

    ———

    Здесь расписаны структура драйвера,компиляция,примеры и.т.д. и т.п. Очень полезная штука.

    В Досе драйвер CON — драйвер стандартного ввода вывода, совмещает драйвер клавы и дисплея.

    Так что тебе надо именно драйвер консоли писать(клав+дисп), который заменит при установке родной драйвер CON.

    А вообще по клавиатуре посмотри Джордейна.

  11. Что касается драйверов (именно драйверов! которые подключаются в config.sys через device=), то поищи в библиотеке или в инете вот это:

    ———

    ББК 32.973.2-018

    Л92

    УДК 681.322-181.4

    Роберт Лэй

    Разработка драйверов устройств для MS-DOS

    Перевод с английского.

    Рязань: Versus Ltd. 1992 .

    ———

    Здесь расписаны структура драйвера,компиляция,примеры и.т.д. и т.п. Очень полезная штука.

    В Досе драйвер CON — драйвер стандартного ввода вывода, совмещает драйвер клавы и дисплея.

    Так что тебе надо именно драйвер консоли писать(клав+дисп), который заменит при установке родной драйвер CON.

    А вообще по клавиатуре посмотри Джордейна.

    [​IMG] _605358720__Sol03.zip

  12. Книга Джордейна называется вроде «Справочник програмиста персонального компьютера» или что-то типа того


  13. Axel Coon

    Axel Coon

    New Member

    Публикаций:

    0

    Регистрация:
    9 ноя 2004
    Сообщения:
    7

    Книжку Лэя поискал — не нашёл, а вот за доку спасибо. Ничего более подробно описывающего работу обработчика девятого прерывания я не видал.


  14. deepstyle

    deepstyle

    New Member

    Публикаций:

    0

    Регистрация:
    8 ноя 2017
    Сообщения:
    1


  15. _edge

    _edge

    Well-Known Member

    Публикаций:

    1

    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia

    Особенно это жестко смотрится под досбокс, который порты эмулирует абы как, пихает свой invalid opcode шлюз в обработчики интов, и с файлами лабораторной работы, сохраненными в docx и rar, .. 13 лет спустя начала топика.

    Извините за стеб, но .. увы. Лабы под дос на заказ, вкуснота! http://www.escolero.ru/shop/13/Programmirovanie_drajvera_ekrana/

    Где упомянутый Рис 40[1], на котором приведена логическая схема драйвера для CGA, не нашел.

    Или я шутку не понял, и это такой (c) 2017 элитный коммерс-спам?

    Deepstyle, добро пожаловать на Васм, так или иначе.


WASM

Linux GPIO разработка драйвера клавиатуры запись_OMAPL138

Базовая настройка Linux завершена. Разработка драйверов Linux началась в последние несколько дней. Начиная с самого простого драйвера клавиатуры, мы постепенно понимаем, каков процесс разработки драйверов. Взглянув на каталог драйверов в файле ядра Linux 3.3 и открыв файл C внутри, я чувствую, что механизм механизма Linux по-прежнему очень сложен, и его изучение требует много времени. То, что мы сейчас разрабатываем, нельзя назвать драйвером, это можно сказать только как приложение драйвера. Давайте начнем с приложения и узнаем больше.

0. Разработка подготовка

  • Исходные файлы ядра (каталог, когда мы собираем ядро ​​в то время, очень важен, и мы должны полагаться на эти исходные файлы ядра при компиляции драйвера)
  • Makefile (управляемый компиляцией Makefile)
  • Источник драйвера
  • Приложение (с основной функцией)

1. Схема подключения клавиатуры

В основном мы используем USER0 и USER1 KEY, две клавиши для завершения разработки драйвера клавиатуры GPIO для Linux. Из рисунка видно, что GPIO0_6 и GPIO6_1 в основном собирают информацию о нажатии на клавиатуру.

2. файл драйвера key.c

Структуру драйвера можно увидеть на рисунке выше.В основном это регистрация устройства ядра Linux. Мы используем platform_device для регистрации ядра. Мы смотрим на это с ума на диаграмму, и определяем это один за другим сзади.

2.1 Структура gpio_key_buttons

Стандартная структура, предоставляемая Linux, в #include

#include <linux/gpio.h>
#include <linux/gpio_keys.h>
#include <mach/da8xx.h>                     // заголовочный файл доски

#define             OMAPL138_KEYS_BEBOUNCE          10
#define             OMAPL138_GPIO_KEYS_POLL_MS      200

#define             OMAPL138_USER_KEY0              GPIO_TO_PIN( 0,6 )
#define             OMAPL138_USER_KEY1              GPIO_TO_PIN( 6,1 )

static const short  omapl138_user_key_pins[] = {
    DA850_GPIO0_6, DA850_GPIO6_1, -1
};

static struct   gpio_keys_button omapl138_user_keys[]   =   {
    [0] = {
        .type               =   EV_KEY,
        .active_low         =   1,
        .wakeup             =   0,
        .debounce_interval  =   OMAPL138_KEYS_BEBOUNCE,
        .code               =   KEY_PROG1,
        .desc               =   "user_key0",
        .gpio               =   OMAPL138_USER_KEY0
    },
    [1] = {
        .type               =   EV_KEY,
        .active_low         =   1,
        .wakeup             =   0,
        .debounce_interval  =   OMAPL138_KEYS_BEBOUNCE,
        .code               =   KEY_PROG2,
        .desc               =   "user_key1",
        .gpio               =   OMAPL138_USER_KEY1
    }
};

Определение порта GPIO может быть другим на других платформах. Я использую OMAPL138, а используемый файл ядра предоставляется OMAPL138. Его определение da8xx.h определяет макроопределение связанного GPIO.Вам нужно найти определение собственной структуры GPIO платформы, измените это определение макроса, Эта структура очень удобочитаема и понятна с первого взгляда..codeТо есть, когда мы пишем приложение, значение, считанное нажатием клавиши, может быть оценено.

2.2 структура gpio_keys_platform_data

Структура platform_data, как следует из ее названия, в основном связана со всеми нашими данными разработки драйверов.

static struct   gpio_keys_platform_data     omapl138_user_keys_pdata    =   {
    .buttons                =   omapl138_user_keys,
    .nbuttons               =   ARRAY_SIZE( omapl138_user_keys )
};

Члены внутри,.buttonsПросто мы определяем массив gpio_keys_button,.nbuttonsЯвляется ли длина, мы используем функцию макросаARRAY_SIZEЗаполните значение.

2.3 платформа_устройства устройства

Карты разума движутся вперед, нам нужно определитьplatform_deviceСтруктура, эта структура является структурой для работы с ядром Linux. Имя устройства внутри.name,.id,dev

static void     omapl138_user_keys_release( struct device *dev ) {

}
static struct   platform_device     omapl138_user_keys_device   =   {
        // you can find mount root by command "dmesg | grep gpio-keys ";
        // cat /proc/bus/input/devices  look the where the device is.
        .name               =   "gpio-keys",
        .id                 =   1,
        .dev                =   {
                            .platform_data  =   &omapl138_user_keys_pdata,
                            .release    =   omapl138_user_keys_release,
        },
};

.nameПрошло, когда драйвер был зарегистрирован в Linuxdmesg | grep gpio-keysКоманда может увидеть это имя, вы можете увидеть его в выводе отладки ядра..idИдентификатор узла, на котором установлено устройство. Тот же идентификатор устройства не может быть повторен..devДанные даны и функции выпуска (могут быть пустыми).

2.4 Функция инициализации и выхода

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

static int __init omapl138_user_keys_init( void )
{
    int reg;
    reg     =   platform_device_register( &omapl138_user_keys_device );
    if( reg ) {
        pr_warning( "Could not register baseboard GPIO tronlong keys!" );
    }else {
        printk( KERN_INFO "User keys register successful!" );
    }
    return reg;
}

static void __exit omapl138_user_keys_exit( void )
{
    platform_device_unregister( &omapl138_user_keys_device );
    printk( KERN_INFO   "user keys unregister ! n" );
}


module_init( omapl138_user_keys_init );
module_exit( omapl138_user_keys_exit );

MODULE_DESCRIPTION( "user keys platform driver," );
MODULE_AUTHOR("Carlos Wei");
MODULE_LICENSE( "GPL" );

Когда мы используемinsmod name.koКогда функция, написанная в module_init (), вызывается автоматически, когда мыrmmod name.koКогда он вызывается, функция, написанная в module_exit (), вызывается автоматически.

3 скомпилируйте ядро ​​или загрузите его как модуль

Мы можем статически скомпилировать этот драйвер в дерево кода ядра или загрузить его в ядро ​​как модуль. Я рекомендую использовать этот модуль для добавления в ядро ​​в начале разработки. После завершения компиляции скомпилируйте ядро. внутри.

3.1 сборник

Укажите путь к исходному файлу ядра, напишите Makefile и загрузите его по произвольному пути на целевой плате после компиляции.

3.1.1 Makefile

ifneq ($(KERNELRELEASE),)

obj-m := key.o

else

all:
    make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi-

clean:
    rm -rf *.ko *.o *.mod.o *.mod.c *.symvers  modul* .button.* .tmp_versions

KDIR=/usr/src/linux-headers-3.3.0-omapl138

endif

Тем более важно здесь:

  • KDIR =? Это местоположение — путь к вашим исходным файлам Linux, (Ядро должно быть скомпилировано заранее
  • CROSS_COMPILE = Этот кросс-компилятор указан. Моё имя кросс-компилятора странное.

3.1.2 Make для генерации key.ko

После завершения компиляции используйте команду ls, чтобы убедиться, что файл key.ko создан.

Передайте файл key.ko на целевую плату через scp или ftp.

3.2 Загрузка драйвера и просмотр узла монтирования

1) insmod key.ko

2) пройтиdmesgПосмотрите, если вывод ядра успешен

3) пройтиcat /proc/bus/input/devicesКоманда для просмотра деталей

Дело в том, что event1, и нам нужно через некоторое время открыть приложение/dev/input/event1Этот узел устройства выполняет операции на клавиатуре GPIO.

4) Проверка ввода с клавиатуры

Когда мы не пишем приложение, мы также можем выполнить простой тест на клавиатуре GPIO простым методом. Узел монтирования GPIO — это Handlers = event1, затем введите:

cat /dev/input/event1

Затем мы нажимаем на клавиатуру.Если терминал нажимает искаженные символы, когда мы нажимаем на клавиатуру, это означает, что наш драйвер был успешно записан.

5) Отцепить драйвер

Если нам не нужен драйвер, нам нужно отключить драйвер:

rmmod key.ko

Вы также можете просмотреть журнал вывода ядра с помощью команды dmesg.

4 Разработка приложений

Создайте файл: key_app.c


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <time.h>
#include <fcntl.h>
#include <linux/input.h>

int main( int argc, char **argv  )
{
    int key_state;
    int fd;
    int ret;
    int code;
    struct input_event buf;

    fd = open( "/dev/input/event1", O_RDONLY );
    if( fd  < 0 ) {
        printf( "Open GPIO_keys failed!!n" );
        return -1;
    }

    printf( "Open GPIO keys successful! n" );
    while( 1 ) {
        ret = read( fd, &buf, sizeof( struct input_event ) );
        if( ret <= 0 ) {
            printf( "read failed! n" );
            return -1;
        }
        code = buf.code;
        key_state   =   buf.value;
        printf("wait...... n");
        switch( code ) {
            case KEY_PROG1:

                code = '1';
                printf( "KEY1 state = %dn", key_state );
                break;
            case KEY_PROG2:

                code = '2';
                printf( "KEY2 state = %dn", key_state );
                break;
        }


    }
    printf("key test finished.n");
    close(fd);
    return 0;
}

Очень простая процедура — вывести регистр. Мы компилируем это:

arm-arago-linux-gnueabi-gcc key_app.c -o key_app.o

Сгенерированный файл key_app.o помещается в каталог Linux целевой платы и затем запускается.

5 Результаты отладки

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

Приложение: исходная программа

Ссылка:https://pan.baidu.com/s/1pNcEBEj Пароль: xpsq


Заявление об авторском праве:

1. Эта статья является дополнительной статьей, разработанной командой MULTIBEANS, и не может быть воспроизведена без разрешения.

2. Если содержание этой статьи нарушает авторские права, свяжитесь со мной, и я своевременно удалю его.

3. Уважайте результаты Все ссылки, использованные в этой статье, дают дань уважения самоотверженным инженерам и энтузиастам.

Понравилась статья? Поделить с друзьями:
  • Как написать драйвер для джойстика
  • Как написать драйвер для андроид
  • Как написать драйвер для mac os
  • Как написать драйвер для linux
  • Как написать драйвер com порта