Драйвер кнопки разработки драйвера для Linux
Драйвер кнопки разработки драйвера для Linux

1. Различные функции регистрации устройств.

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

Ниже приведены интерфейсы для различных символьных устройств:

Язык кода:javascript
копировать
struct miscdevice  {
	int minor;   /*Номер вторичного устройства 10 20 */
	const char *name; /*Имя узла устройства*/
	const struct file_operations *fops; /*Коллекция файловых операций*/
	struct list_head list; // связанный список
	struct device *parent; 
	struct device *this_device;
	const char *nodename;
	umode_t mode;
};

//Регистрируем разные символьные устройства
extern int misc_register(struct miscdevice * misc);
//Отменяем регистрацию различных символьных устройств
extern int misc_deregister(struct miscdevice *misc);

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

Язык кода:javascript
копировать
#include <asm/uaccess.h>

unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
Функция функция: Скопируйте данные уровня драйвера на уровень приложения.
Параметры функции:
void __user *to  Адрес пространства пользователя – куда идти
const void *from  Адрес уровня драйвера — откуда он берется
unsigned long n  размер копии
Возвращаемое значение:  0 указывает на успех. >0Указывает количество копий, которые не были успешно скопированы.。

unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
Функция функция: Скопируйте данные с уровня приложения на уровень драйвера.
Параметры функции:
void  *to  Адрес места на диске — куда его скопировать
const void __user *from  Адрес пользовательского пространства — откуда он берется
unsigned long n  размер копии
Возвращаемое значение:  0 указывает на успех. >0Указывает количество копий, которые не были успешно скопированы.。

2. Написать драйвер кнопки

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

Прежде чем писать драйвер, нужно найти принципиальную схему кнопки и узнать, к какому IO кнопка подключена к ЦП.

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

2.1 Исходный код драйвера кнопки

Язык кода:javascript
копировать
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <asm/io.h>
#include <asm/uaccess.h>

/* Кнопка регистрации*/
static unsigned int *GPX3CON;
static unsigned int *GPX3DAT;

static int tiny4412_open(struct inode *inode, struct file *file)
{
	printk("tiny4412_open-->ok\n");
	return 0;
}

/*Функции прикладного уровня: 
int key_val;
read(fd,&key_val,4)
ssize_t read(int fd, void *buf, size_t count);
*/
static ssize_t tiny4412_read(struct file *file, char __user *buf, size_t size, loff_t *seek)
{
	int key_val=0;
	if(!(*GPX3DAT&1<<2)) //Определяем, нажата ли кнопка
	{
		key_val=0x1;
	}
	else if(!(*GPX3DAT&1<<3)) //Определяем, нажата ли кнопка
	{
		key_val=0x2;
	}
	else if(!(*GPX3DAT&1<<4)) //Определяем, нажата ли кнопка
	{
		key_val=0x3;
	}
	else if(!(*GPX3DAT&1<<5)) //Определяем, нажата ли кнопка
	{
		key_val=0x4;
	}

	/*Функция копирования данных: Присвойте значение пространству прикладного уровня — скопируйте данные уровня драйвера на прикладной уровень*/
	/*copy_to_user(void __user *to, const void *from, unsigned long n)*/
    int error;
	error=copy_to_user(buf,&key_val,4);
	if(error>0)
	{
		printk("Не удалось скопировать данные.\n");
	}
	return 0;
}
static ssize_t tiny4412_write(struct file *file, const char __user *buf, size_t size, loff_t *seek)
{
	
	return 0;
}
static int tiny4412_release(struct inode *inode, struct file *file)
{
	printk("tiny4412_release-->ok\n");
	return 0;
}

static struct file_operations fops=
{
	.open=tiny4412_open,
	.read=tiny4412_read,
	.write=tiny4412_write,
	.release=tiny4412_release
};

/*
Драйвер управления ядром Linux — номер устройства
Номер устройства является беззнаковым int Переменная - 32 бита.
Номер устройства = основной номер устройства + дополнительный номер устройства.
*/
static struct miscdevice misc=
{
	.minor = MISC_DYNAMIC_MINOR,  /*Номер вторичного устройствозаполнение 255 означает автоматическое распределение     Основной номер устройства фиксирован: 10*/
	.name = "tiny4412_key",  /*/Имя файла в каталоге dev*/
	.fops = &fops, /*Интерфейс работы с файлами*/
};

static int __init tiny4412_key_init(void)
{
    /*Преобразование физического адреса*/
	GPX3CON=ioremap(0x11000C60,4);
	GPX3DAT=ioremap(0x11000C64,4);

	/*Настроить режим порта GPIO — настроить кнопки*/	
	*GPX3CON&=0xFF0000FF;	
	
	/*1. Функции регистрации для разных устройств*/
	misc_register(&misc);
    printk("Кнопка: Установка драйвера прошла успешно\n");
    return 0;
}

static void __exit tiny4412_key_exit(void)
{
	/*2. Функция выхода из системы для различного оборудования*/
	misc_deregister(&misc);

	/*Отменить преобразование*/
	iounmap(GPX3CON);
	iounmap(GPX3DAT);
    printk("Кнопка: Драйвер успешно удален\n");
}

module_init(tiny4412_key_init); /*Ввод драйвера — выполняется при установке драйвера*/
module_exit(tiny4412_key_exit); /*Экспорт драйвера — выполняется при удалении драйвера*/

MODULE_LICENSE("GPL");  /*Установить лицензию модуля — GPL*/

2.2 make-файл

Скомпилируйте код make-файла драйвера.

Язык кода:javascript
копировать
KER_DRI=/home/wbyq/work/linux-3.5/linux-3.5
all:
	make -C $(KER_DRI) M=`pwd` modules
	cp *.ko /home/wbyq/work/rootfs/code -f
	make -C $(KER_DRI) M=`pwd` modules clean
	arm-linux-gcc app.c -o app
	cp app /home/wbyq/work/rootfs/code -f
	rm app -f
obj-m += miscdev_key_drv.o

2.3 Тестовый код драйвера прикладного уровня

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

Язык кода:javascript
копировать
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc,char **argv)
{
    if(argc!=2)
    {
        printf("./app <Файл узла устройства>\n");
        return 0;
    }
    /*1. Открыть файл устройства*/
    int fd=open(argv[1],O_RDWR);
    if(fd<0)
    {
        printf("%s Не удалось открыть драйвер устройства.\n",argv[1]);
        return 0;
    }
    /*2.Чтение и запись данных*/
    int key_val;
    while(1)
    {
        read(fd,&key_val,4);//Читаем значение ключа
если (key_val)
{
printf("%#x\n",key_val);
		}
    }
    /*3. Закрыть файл*/
    close(fd);
    return 0;
}

2.4 Процесс установки драйвера

Язык кода:javascript
копировать
[root@wbyq code]# ls
tiny4412_key_drv.ko
[root@wbyq code]# 
[root@wbyq code]# insmod tiny4412_key_drv.ko 
[  173.340000] Тест водителя: Установка драйвера прошла успешно
[root@wbyq code]# lsmod
hello_drv 616 0 - Live 0xbf000000 (O)
[root@wbyq code]# modinfo tiny4412_key_drv.ko 
filename:       tiny4412_key_drv.ko
license:        GPL
depends:        
vermagic:       3.5.0-FriendlyARM SMP preempt mod_unload ARMv7 p2v8 
[root@wbyq code]# rmmod tiny4412_key_drv.ko 
[  391.075000] Тест водителя: Драйвер успешно удален
[root@wbyq code]#
boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]