logo
publist
写文章

简介

该用户还未填写简介

擅长的技术栈

可提供的服务

暂无可提供的服务

Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (14-19)设备树相关

这样内核打开相关驱动文件之后,驱动读取设备树文件dtsi就知道SPI总线用的是40Mhz的时钟晶振,spi 的sclk 20MHZ,中断,读是哪个IO口。总而言之,PCB 软件用画原理图来表明这个设备的情况,设备树是通过语言的方式描叙硬件的状态。具体设备树怎么写一般下载内核后在DOCUMENT下面查找各个内核的设备树,照说明写。这个系列没有说中断,DMA,SPI,UART,IIC等,也没说网络设备

#linux#驱动开发#运维
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (12)(13)IOCTL

关于这个unlocked_ioctl 以及它和早期的linux 内核中的ioctl() 见其他大佬的说明。ioctl,字面意思是输入输出控制,lesson12 里面对这个玩意的作用说了个清除,超越常规的r/w/open/close 操作之外,设备文件有时候需要更多的参数来配置控制。lesson12 复制的是lesson8/9的代码,给了cdev_init(&my_cdev,&fops) 中fops

#linux#驱动开发#运维
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (7)open,release (8) write read

两个程序都写完了,视频开始编译驱动程序,insmod之后,mknod/dev/hello0从236 0;最后在应用层跑测试,分别做这两个字符设备,打印不同的次设备号,不同模式,表明测试程序成功。这几个课程加起来就是对字符设备常用的操作开,关,读,写的操作,构成了字符设备的开发架构。我认为字符设备其实都可以理解为在这个架构上开发的。和lesson5 对比,十分类似,lesson5 只实例化了.rea

#linux
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (9)manual_cdev

register_chrdev_region 需要配置主/副设备号,这里用的 STATIC_DEVNR ,MINORMASK+1 来注册字符设备 hello_cdev。不过这节系统内核添加hello_cdev这个设备驱动之后还是要mknod 创建字符设备 mknod /dev/hello0 c 236 0。这样系统内核就添加字符设备,在 /proc/dev/中可以看到字符设备 hello_cdev

#linux#驱动开发#运维
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (11)kmalloc 动态内存分配和struct file中的私有数据

malloc/free 在c 里面很常见的成对出现,用于申请内存空间和释放内存空间,这里的kmalloc/free 成对出现在open/release 里面。然后read/write 函数里面就是copy_to_user()/user_to_copy()。不看视频,直接看这个程序,能理解这个程序是注册了一个字符设备文件,打开字符设备文件就会申请下一段64bit(MEMSIZE)内存空间,从外部用户

#linux#驱动开发#算法
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》(4) devicefile 设备号相关

在 Linux 中一切设备都是文件,系统用文件的开关读写抽象了设备的操作,所以 <linux/fs.h> 中的 file_operation 至关重要。查看 Linux 系统的 /dev/ 文件夹,查看设备文件和文本文件的不同。实际上 /dev/ 下的设备文件大多都是虚拟文件,关闭树莓派之后,PC 查 SD 卡可以看到 /dev/ 文件夹大多是空的。举例 /dev/gpiochip0 的主设备号

#linux#运维#服务器
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》(5) hello_cdev (6) log_level

fs.h中的读是ssize_t (*read) (struct file *, char __user *, size_t, loff_t *),例子里面是my_read(struct file *f, char __user *u, size_t l, loff_t *o),可见参数是可以重写的;lesson6 printk 的各种报告等级。学过stme32单片机的,可以理解为<linux/fs

#linux#驱动开发#运维
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》(1)hello world

shell 表示shell 脚本,uname -r 表明系统的内核版本,/lib/modules/$(shell uname -r)/build等于表达内核目录,相当于开发路径。所以这个命令等于 make -C /lib/modules/xxx/buildM=xxx(当前目录) modules。module.h 提供内核动态加载移除,init.h 提供内核函数如何加载移除。程序最后是内核开发的MO

#linux#运维#服务器
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》(2)better hello

将初始化和移除的函数添加了static 关键字,保证函数my_init() /my_exit()只能在这个hello.c文件中调用,显然安全程度高了很多。添加MODULE_AUTHOR/MODULE_DESCRIPTION 添加了模块说明,以后可以用modinfo等命令查看模块信息。这个hello.c就是最简单的linux 内核驱动模块程序了。解释了加载/移除 驱动模块 ,加载模块之后如何查看内核

#驱动开发#linux#运维
    共 15 条
  • 1
  • 2
  • 请选择