
linux驱动
文章平均质量分 63
linux驱动程序为主
bai-xin
种一棵树,最好的时间是十年前,其次是现在(间歇性看CSDN,消息不能及时回复,请见谅)
展开
-
linux用户层驱动-uio
UIO(Userspace I/O)是运行在用户空间的I/O技术。UIO适合在编写大型驱动程序的时候使用,它免去了频繁的内核模块的切换与重启。另外某些情况下性能也比内核驱动好,比如典型的应用例子就是dpdk。除了实现用户态驱动以外UIO也适合在虚拟化的时候做设备透传,相较于VFIO也是一种不错的选择。1.UIO的工作方式设备驱动的编写无非是两件事情:1.设备内存的读写2.中断的响应UIO实现了mmap,可以实现映射物理内存到虚拟内存供用户层读写。中断的响应必须在内核进行,UIO在内核实现了很少一原创 2021-01-15 15:35:24 · 1459 阅读 · 1 评论 -
37.【linux驱动】pcie驱动入门
pcie总线向下兼容pci总线,文中所述pci默认等于pciepcie拓扑结构pcie拓扑主要由总线、桥和设备卡组成,桥将父总线与子总线连接在一起形成树型结构。桥主要分为一下三类:Host/PCI桥:用于连接CPU与PCI根总线,在PC中,内存控制器也通常被集成到Host/PCI桥设备芯片,Host/PCI桥通常被称 为“北桥芯片组”。PCI/ISA桥:用于连接旧的ISA总线。PCI/ISA桥也被称为“南桥芯片组”。PCI-to-PCI桥:用于连接PCI主总线与次总线。pci总线编号采用原创 2020-08-05 12:44:33 · 3031 阅读 · 0 评论 -
36.【linux驱动】spi framebuffer驱动(切换并显示虚拟终端)
切换终端输出接这上一节spi framebuffer驱动实现了,但是只有刷屏。6个虚拟终端并没有显示在屏幕上,要想办法让虚拟终端显示到我们的fb上面来。最总虚拟终端的源代码(过程不详述),发现了这么个地方:/driver/video/console/fbcon.cstatic int fbcon_event_notify(struct notifier_block *self, unsigned long action, void *data){ struct fb_event原创 2020-07-27 20:57:08 · 1689 阅读 · 4 评论 -
35.【linux驱动】spi framebuffer驱动
spi framebuffer驱动上一节实现了一个framebuffer驱动,但是没有具体操作硬件,这节做一个SPI屏驱动,整个代码作为一个spi驱动去写。spi相关内容可以看()[]。首先是spi驱动,屏幕的操作由厂家C51代码改编而来。屏幕控制器是ILI9488,分辨率320 * 480spi部分spi.hstruct Lcd_dev{ unsigned short width; //LCD 宽度 unsigned short height; //L原创 2020-07-27 20:14:47 · 1986 阅读 · 0 评论 -
34.【linux驱动】framebuffer驱动
2原创 2020-07-27 19:59:42 · 625 阅读 · 0 评论 -
32.【linux驱动】一文读懂linux设备驱动模型(常见总线bus)
1原创 2020-07-27 18:35:37 · 774 阅读 · 0 评论 -
31.【linux驱动】一文读懂linux设备驱动模型(总线bus)
4原创 2020-07-25 00:59:46 · 489 阅读 · 0 评论 -
30.linux内核 阻塞/非阻塞IO
阻塞IO等待队列非阻塞IOpoll/select/epoll原创 2020-07-24 23:42:40 · 297 阅读 · 0 评论 -
29.linux内核(线程/进程)同步——完成量
完成量原创 2020-07-23 16:26:51 · 258 阅读 · 0 评论 -
28.linux内核(线程/进程)同步——互斥锁
互斥锁原创 2020-07-23 16:00:38 · 365 阅读 · 0 评论 -
27.linux内核(线程/进程)同步——信号量
信号量原创 2020-07-23 15:39:55 · 293 阅读 · 0 评论 -
26.linux内核(线程/进程)同步——自旋锁
自旋锁自旋锁(spin lock)是一种排他锁,采用死循环来竞争资源,竞争不到就无限尝试,所以又叫自旋锁。适合短生命周期的资源竞争,比较浪费CPU,实现原理就是上一篇当中的原子操作。当strex操作失败后会重新进入 ldrex 再 strex 的过程,无限尝试下去,直到成功。相关api在 spinlock.h 中//定义锁spinlock_t data_lock;//初始化锁spin_lock_init(_lock)//上锁,如果锁不上就会自旋void spin_lock(spinlock_原创 2020-07-23 00:50:55 · 454 阅读 · 0 评论 -
25.linux内核(线程/进程)同步——原子操作
原子操作原子操作主要是借助汇编指令strex 和 ldrex 。使用ldrex 总线会监控有没有其他实体存取该地址,如果有会其他实体进行strex操作会失败,只有当本实体strex后其他实体才可以strex。这两个操作对应的内核封装在atomic.h中//设置变量的值#define ATOMIC_INIT(i) { (i) }#define atomic_set(v,i) (((v)->counter) = (i))//读取#define atomic_read(v) (*(volat原创 2020-07-23 00:50:12 · 671 阅读 · 0 评论 -
24.linux内核(线程/进程)同步——内存屏障
多核同步需要关注的第一件事就是自己的值被有序确切的写入了内存。由于编译器优化,CPU cache机制以及CPU乱序执行的原因,在多核CPU多线程条件下,线程或者进程交换数据未必是预期中的结果。这个时候就需要使用内存屏障来解决这个问题。gcc编译选项我们使用gcc的gcc-objdump -d来反汇编代码,查看编译结果。通常情况下gcc会默认连接启动文件crtl.o、crti.o、crtend.o,这些会干扰我们查看汇编代码。使用-nostartfiles编译选项禁止连接启动文件。另外还会连接标准库,使原创 2020-07-22 16:35:59 · 482 阅读 · 0 评论 -
23.nanopi t2 s5p4418超频
3原创 2020-07-03 12:50:23 · 431 阅读 · 0 评论 -
20.Linux3.4内核启动源码分析(zImage内核解压过程分析)
看一下linux/arch/arm/boot/compressed/Makefile文件中连接脚本是那个是vmlinux.lds.in。$(obj)的值就是当前目录。linux/arch/arm/boot/compressed/vmlinux.lds.in入口为_start,我这个内核和一般的不太一样,一般入口都是stext。全局搜索一下_start:加上冒号缩小范围。发现在init.S里面linux/arch/arm/boot/bootp/init.S...原创 2020-07-02 19:07:22 · 434 阅读 · 0 评论 -
22.修复nanopi t2 cpu调频不起作用 nxp-cpufreq nxp-cpufreq.0: Cannot get regulator for DVS supply vdd_arm_1.3V
[root@minicoco ~]# dmesg | grep cpu[ 0.000000] Initializing cgroup subsys cpuset[ 0.000000] Initializing cgroup subsys cpu[ 0.000000] PERCPU: Embedded 9 pages/cpu @c136a000 s12352 r8192 d16320 u36864[ 0.000000] pcpu-alloc: s12352 r8192 d163原创 2020-07-02 17:38:11 · 817 阅读 · 0 评论 -
15.【linux驱动】spi驱动
代码原创 2020-06-28 01:16:05 · 910 阅读 · 0 评论 -
16.【linux驱动】spi驱动TFT液晶屏
代码原创 2020-06-22 23:08:08 · 1843 阅读 · 0 评论 -
14.【linux驱动】spi(GPIO模拟)
代码原创 2020-06-22 15:44:41 · 2601 阅读 · 0 评论 -
13.【linux驱动】spi 硬件、协议
连接原创 2020-06-22 15:41:40 · 331 阅读 · 0 评论 -
19.【linux驱动】IIC驱动(OLED屏)
代码原创 2020-06-18 17:46:32 · 1746 阅读 · 0 评论 -
18.【linux驱动】IIC驱动(4418读取EEPROM:24AA025E48T-I/OT)
目录概述电路原理图4418芯片手册:IIC驱动代码24AA025E48T-I/OT芯片手册测试代码IIC系类文章索引:概述本文以24AA025E48T-I/OT EEPROM读取为例讲解IIC下的Linux驱动电路原理图24AA025E48T-I/OT连接在了IIC0上IIC0连接在GPIOD2/3上4418芯片手册:IIC先看一下4418的芯片手册关于IIC的介绍以及寄存器地址,4418内部集成IIC控制器,不需要我们手动一位一位的去操作IO口。1.IIC控制器发送接收操作意思是原创 2020-06-18 17:43:35 · 1089 阅读 · 0 评论 -
17.【linux驱动】IIC驱动OLED屏(GPIO 模拟)
代码在这里插入代码片原创 2020-06-18 17:00:40 · 1154 阅读 · 2 评论 -
12.【linux驱动】内核空间用户空间数据传递
linux分为用户空间和内核空间,两者的虚拟地址空间分布不一样。内核占用高地址,应用程序占有低地址空间,每个进程的内核虚拟地址都是一样的,区别在于进程的用户控件映射不同,所以内核也可以直接使用用户空间的指针读写数据,但是用户空间的内存可能被换出去,所以还是需要借助内核函数去读写。主要有这几个函数:access_ok(),copy_to_user(),copy_from_user,put_user,get_user1.access_ok()函数原型:int access_ok(int type,uns原创 2020-06-18 16:51:58 · 613 阅读 · 0 评论 -
11.构建Ubuntu系统
下载根文件系统解压拷贝qemu替换软件源添加挂载脚本进入系统修改机器名修改root密码添加用户修改挂载点/fstab安装必要命令 net-tools wireless-tools安装sudo 配置/etc/sudoers安装桌面环境原创 2020-06-18 14:46:05 · 614 阅读 · 0 评论 -
10.【linux驱动】PWM
寄存器版本API版本原创 2020-06-13 15:34:25 · 490 阅读 · 1 评论 -
8.【linux驱动】ioctl
函数原型long (*unlocked_ioctl) (struct file *fl, unsigned int cmd, unsigned long arg);原创 2020-06-12 16:55:24 · 254 阅读 · 0 评论 -
7.【linux驱动】中断
用GPIOB_31模拟按键功能,设置上拉,下降沿触发寄存器版本linux驱动几乎不用管硬件中断了,内核已经帮我们管理好了所有硬件中断号,并且定义了相应的内核中断号,我们只需要看一下内核中断号。这里GPIOB_31直接用IRQ_GPIO_B_START + 31就好。数据手册中得到下降沿触发值为0b010=2。有关GPIO寄存器的定义和操作可以见这篇文章:【linux驱动】GPIO#include <linux/init.h>#include <linux/module.h&原创 2020-06-11 03:21:32 · 365 阅读 · 0 评论 -
6.【linux驱动】字符设备
#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/device.h>#include <linux/cdev.h>#include <asm/uaccess.h>MODULE_LICENSE("GPL");static int data原创 2020-06-10 22:51:57 · 157 阅读 · 0 评论 -
5.【linux驱动】GPIO
演示代码使用GPIO_B_31引脚输出模式寄存器版本查看芯片手册GPIO描述输出模式需要设置引脚功能,nexell的cpu GPIO脚一共有四种可选功能,每个脚的选项不一样。这里说要用作IO得设置为00,其实是错误的,不得不说nexell的设计很奇葩因为GPIO功能并不一定都是00,这次的GPIO_B_31就得设置为01,如下图描述。另外使能使出和设置电平就可以了。看下寄存器描述输入使能和高低电平很简单,对位设置就好。功能设置部分每两位配置一个引脚。定义寄存器结构体,吧用到的定义一下就好#原创 2020-06-10 19:54:00 · 395 阅读 · 0 评论 -
3.根文件系统构建(2)
根文件系统构建(1)目录编写inittab编写rcS文件编写fstab文件添加hostname文件profile文件passwd文件shadow文件修改inittab编写inittabinittab的格式为 终端设备:运行级别:执行条件:命令执行条件可选有:sysinit, respawn, askfirst, wait, once,restart, ctrlaltdel, and shutdown. sysinit:在系统引导期间执行进程 respawn:无论什么时原创 2020-06-10 19:27:30 · 538 阅读 · 0 评论 -
16.【linux驱动】IIC驱动-硬件、协议
目录概述时序概述概述概述IIC总线使用两条串行线路传输数据 SDA :串行数据线 SCL :串行时钟传输模式为半双工传输是一个多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏每个连接到总线上的器件都有唯一的地址,数据传输和地址设定由软件设定传输时钟由主机产生总线空闲状态 : SDA :高电平 SCL :高电平时序开始信号:SCL高电平,SDA由高电平跳变为低电平开始终止:SCL高电平,SDA由低电平跳变为高电平数据传输:数据位原创 2020-06-04 20:18:50 · 435 阅读 · 1 评论 -
4.【linux驱动】hello_world
目录hello_world源码Makefile加载卸载测试hello_world源码#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>MODULE_LICENSE("GPL");static int __init hello_init(void){ printk("hello init\n"); return 0;}static void __exit原创 2020-06-04 18:26:54 · 199 阅读 · 0 评论 -
2.构建最小根文件系统(踩坑记录)
目录配置编译busybox1.解压2.修改Makefile3.配置4.编译5.安装6.创建常用文件夹拷贝链接库配置系统1. 添加inittab文件到etc文件夹2. inittab格式解析3. 添加rcS文件安装qemu1. 安装qemu2. 拷贝运行环境到rootfs3. 在rootfs外面添加挂载脚本:mount-rootfs.sh4. 添加卸载脚本:umount-rootfs.sh5.chroot进去先爽一把nfs远程挂载1.重启开发板搭建一个用于驱动开发的最小根文件系统配置编译busyboxb原创 2020-06-02 21:22:09 · 612 阅读 · 0 评论 -
1.Linux内核从远程nfs启动(踩坑记录)
目录前言配置内核支持NFS启动搭建NFS服务器前言本次实验的启动方式是:通过网络挂载rootfs,内核从sd卡加载,并没有通过网络下载关于uboot的两点配置bootargs,bootcmdbootargs:传递给内核使用的参数,对uboot来说只是一个环境变量bootcmd:uboot启动命令,主要是加载内核,设备树,rootfs,然后用bootm启动内核1.先将随便烧写个官方镜像到sd卡(也不能太随便,只要你要编译的内核要接近镜像的,否则后面替换内核可能导致uboot和内核版本不匹配,从而无原创 2020-06-02 20:24:10 · 1870 阅读 · 0 评论