Ubuntu搭建驱动开发环境

news/2024/11/16 7:55:09/

1、使用的是linux-5.0.1 ubuntu1910

2、安装依赖

build-essential
kernel-package
gcc
make
libncurses5-dev
libssl-dev
libelf-dev

均可用sudo apt-get install …

3、源文件获取与安装

3.1、获取内核源码

# 查看系统内核版本
uname -r
5.0.0-32-generic
# 获取源文件包
sudo apt-get install linux-source-5.0.0
# 文件包默认在/usr/src中
cd /usr/src
linux-source-5.0.0.bz2
# 解压至指定目录
sudo tar -jxvf linux-source-5.0.0.bz2 -C ~/linux-kernel
# 进入源码包目录
cd ~/linux-kernel/linux-source-5.0.0

3.2、安装

# 编译
sudo make oldconfig
# 最耗时
sudo make
# 生成设备树
sudo make modules
sudo make modules_install
# 在lib/modules目录中生成设备树
cd /lib/modules
yang@yang-Lenovo:/lib/modules$ ll
总用量 20
drwxr-xr-x   5 root root 4096 1116 14:30 ./
drwxr-xr-x 142 root root 4096 1112 20:37 ../
drwxr-xr-x   5 root root 4096 417  2019 5.0.0-13-generic/
drwxr-xr-x   5 root root 4096 1112 11:22 5.0.0-32-generic/
drwxr-xr-x   3 root root 4096 1116 14:35 5.0.21/

(注意:我的执行编译sudo make oldconfig时会出现错误,
解决办法:安装bison
sudo apt-get install basion(至少我的这样可以解决))

4、测试

(我直接在家目录下创建一个目录)

yang@yang-Lenovo:~/my_cdev$ ls
chr_dev_test.c  led_dev.c  Makefile  my_chr_dev.c

(忽略led_dev.c)
1)字符设备驱动文件:my_chr_dev.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/kernel.h>#define BASEMINOR 0
#define COUNT     2
#define NAME      "led_dev"dev_t dev_num;
struct cdev *cdevp = NULL;static char kernel_val = 6;//对应用户层的int open(const char *pathname, int flags);
int open_cdev(struct inode *ino, struct file *filp)
{printk("open_cdev secuss\n");return 0;
}//对应应用层的ssize_t read(int fd, void *buf, size_t count);
ssize_t read_cdev(struct file *filp, char __user *buf, size_t count, loff_t *loff)
{int ret;ret = copy_to_user(buf, &kernel_val, count);if(ret > 0){printk("copy_to_user error\n");return -1;}return 0;
}//对应应用层的write
ssize_t write_cdev(struct file *filp, const char __user *buf, size_t count, loff_t *loff)
{char value;int ret;ret = copy_from_user(&value, buf, count);if(ret > 0){printk("copy_from_user error\n");return -2; }printk("From user data: %d\n", value);return 0;
}struct file_operations fops = {.owner = THIS_MODULE,.open  = open_cdev,.write = write_cdev,.read  = read_cdev
};static int my_cdev_init(void)
{int ret; //1、分配设备号ret = alloc_chrdev_region(&dev_num, BASEMINOR, COUNT, NAME);if(ret < 0){printk("alloc_chrdev_region failed\n");return -1;}//2、为cdev结构体分配内存空间cdevp = cdev_alloc();if(NULL == cdevp){printk("cdev_alloc failed\n");unregister_chrdev_region(dev_num, COUNT);return -2;}//3、设备初始化cdev_init(cdevp, &fops);//4、注册字符设备到内核ret = cdev_add(cdevp, dev_num, COUNT);if(ret < 0){printk("cdev_add failed\n");unregister_chrdev_region(dev_num, COUNT);return -3;}printk("major = %d\n", MAJOR(dev_num));printk("my_cdev_init sucess\n");return 0;
}static void my_cdev_del(void)
{//5、删除字符设备cdev_del(cdevp);//6、注销设备号unregister_chrdev_region(dev_num, COUNT);printk("my_cdev_del sucess\n");
}module_init(my_cdev_init);
module_exit(my_cdev_del);
MODULE_LICENSE("GPL");

2)Makefile

ifneq ($(KERNELRELEASE),)
obj-m := my_chr_dev.oelse
PWD  := $(shell pwd)
KVER := $(shell uname -r) 
KDIR := /lib/modules/`uname -r`/buildall:$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.* Module.*
endif

3)测试文件:chr_dev_test.c

#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"int main(void)
{int ret;int fd;char rd_buf;fd = open("/dev/led0", O_RDONLY);if(fd < 0){printf("open failed\n");return -1;}read(fd, &rd_buf, 1);printf("rd_buf = %d\n", rd_buf);close(fd);return 0;
}

运行验证步骤如下:
1)进入自己创建的所在目录下,直接输入make

yang@yang-Lenovo:~$ cd ./my_cdev/
yang@yang-Lenovo:~/my_cdev$ ls
chr_dev_test.c  led_dev.c  Makefile  my_chr_dev.c
yang@yang-Lenovo:~/my_cdev$ make
make -C /lib/modules/`uname -r`/build M=/home/yang/my_cdev modules
make[1]: 进入目录“/usr/src/linux-headers-5.0.0-32-generic”CC [M]  /home/yang/my_cdev/my_chr_dev.oBuilding modules, stage 2.MODPOST 1 modulesCC      /home/yang/my_cdev/my_chr_dev.mod.oLD [M]  /home/yang/my_cdev/my_chr_dev.ko
make[1]: 离开目录“/usr/src/linux-headers-5.0.0-32-generic”
yang@yang-Lenovo:~/my_cdev$ ls
chr_dev_test.c  modules.order   my_chr_dev.ko     my_chr_dev.o
led_dev.c       Module.symvers  my_chr_dev.mod.c
Makefile        my_chr_dev.c    my_chr_dev.mod.o

2)注册字符设备:

sudo insmod my_chr_dev.ko

然后能查看到设备中多了字符设备led_dev:

cat /proc/devices116 alsa
128 ptm
136 pts
180 usb
189 usb_device
204 ttyMAX
226 drm
*238 led_dev*
239 vfio
240 aux
241 mei
242 hidraw

3)创建字符设备对应的节点:

yang@yang-Lenovo:~/my_cdev$ sudo mknod /dev/led0 c 238 0  //注意:238为主设备号, 0为次设备号
yang@yang-Lenovo:~/my_cdev$ ll /dev/led0
crw-r--r-- 1 root root 238, 0 1116 15:24 /dev/led0

4)运行测试程序:
(由3)可以看出yang用户对led0只有’r’权限, 故测试文件中没有测试write,当然可以通过修改权限来测试write)

yang@yang-Lenovo:~/my_cdev$ gcc chr_dev_test.c
yang@yang-Lenovo:~/my_cdev$ ./a.out
rd_buf = 6

5)删除设备节点:

sudo rm /dev/led0

6)卸载字符设备:

sudo rmmod my_chr_dev.ko

(参考链接:https://blog.csdn.net/Xin_101/article/details/84791761)


http://www.ppmy.cn/news/734963.html

相关文章

WinXP内核驱动调试

友链 使用vmware创建一个xp虚拟机&#xff0c;确保你是Administrator用户&#xff0c;打开cmd&#xff0c;cd进入C盘根目录 然后执行notepad boot.ini&#xff0c;内容应该是下面这样的 [boot loader] timeout30 defaultmulti(0)disk(0)rdisk(0)partition(1)\WINDOWS [opera…

linux内核编译指定驱动,linux内核编译,配置本机驱动

1.前言 编译linux内核失败的原因很多时候就是驱动选错&#xff0c;适合自己本机的驱动没编译进去。面对特殊平台(或者有些洁癖者&#xff0c;我就是^_^)&#xff0c;要编译精简内核&#xff0c;只要本机驱动&#xff0c;其他都不需要。面对内核里面这么多驱动&#xff0c;不懂硬…

Linux驱动

按照常规分类方法&#xff0c;linux驱动可以分为字符设备&#xff0c;块设备&#xff0c;和网络设备。 字符设备是一种按字节来访问的设备&#xff0c;字符驱动则负责驱动字符设备&#xff0c;这样的驱动通常支持open&#xff0c;close&#xff0c;read和write系统调用。例&…

驱动开发——HelloWDM驱动

友链 hellowdm.h // 保证头文件只被编译一次 // 因为在实际项目中&#xff0c;一个头文件可能会被另一个头文件包含 // 比如b.h中包含了a.h // 然后在c.c中有如下代码&#xff1a; /* #include<a.h> #include<b.h> */ // 这样一来&#xff0c;a.h就被包含了两次 …

windows内核驱动开发

友链 hellodriver 使用VS2019 项目地址 代码 // I dont like NTSTATUS, it like shit typedef NTSTATUS _nt;/* your driver must implement two basic event callback fucnions at least which is:- DRIVER_INITIALIZE DriverEntry- EVT_WDF_DRIVER_DEVICE_ADD KmdfHello…

数据标注:数字病理学中的人工智能

在数字病理学中&#xff0c;组织样本的显微图像被传输到计算机&#xff0c;并使用先进的图像处理技术和计算机视觉对其进行分析。 医学图像和诊断的数字化为病理学中的人工智能开辟了途径。病理学家可以使用机器学习模型来进行增强分析并提高结果准确性。此外&#xff0c;病理学…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习二)

嵌入式操作系统FreeRTOS FreeRTOS是一个专门为轻量级嵌入式应用设计的迷你操作系统&#xff0c;它的主要功能由IPC、时钟管理、内存管理、任务通知以及任务调度等部分构成。 FreeRTOS的代码可以分解为三个主要区块&#xff1a;任务调度、通讯、硬件库。 任务调度&#xff1a;F…

蒲公英枸杞菊花可以一起泡茶喝吗?

这两年花草茶、花果茶甚是流行和风靡&#xff0c;加上人们对健康养生越来越重视&#xff0c;像蒲公英、菊花和枸杞这样组合在一起&#xff0c;人们也不陌生&#xff0c;三者不但都是传统的中药&#xff0c;更是一种食材&#xff0c;不管是泡水、煎汤、煮粥&#xff0c;都能起到…