linux驱动开发
文章平均质量分 75
linux驱动开发
迁旭
这个作者很懒,什么都没留下…
展开
-
删除kernel和uboot下未编译的文件
删除kernel和uboot下未编译的文件,方便之后的文件分析,排除多余的干扰项目代码如下测试可以#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dirent.h>#include <unistd.h>int readFileList(char *basePath){ DIR *dir; struct dirent *ptr...原创 2022-04-16 15:28:42 · 202 阅读 · 0 评论 -
工作队列workqueue
工作队列 <linux/workqueue.h>工作队列类似 taskets,允许内核代码请求在将来某个时间调用一个函数,不同在于:(1)tasklet 在软件中断上下文中运行,所以 tasklet 代码必须是原子的。而工作队列函数在一个特殊内核进程上下文运行,有更多的灵活性,且能够休眠。(2)tasklet 只能在最初被提交的处理器上运行,这只是工作队列默认工作方式。(3)内核代码可以请求工作队列函数被延后一个给定的时间间隔。(4)tasklet 执行的很快, 短时期, 并且在原子.原创 2021-08-10 19:37:07 · 270 阅读 · 0 评论 -
Tasklets
Tasklets #include <linux/interrupt.h>它类似内核定时器:在中断时间运行且运行同一个CPU上,并接收一个 unsigned long 参数。不同的是:无法要求在一个指定的时间执行函数,只能简单地要求它在以后的一个由内核选择的时间执行。它对于中断处理特别有用:硬件中断必须尽快处理, 但大部分的数据管理可以延后到以后安全的时间执行。实际上,一个 tasket,就象一个内核定时器,在一个"软中断"的上下文中执行(以原子模式)。软件中断是在使能硬件中断时执行异步..原创 2021-08-10 19:20:42 · 130 阅读 · 0 评论 -
时间、延时、延缓操作
<linux/param.h>可通过定义的CPUHz值判断时间使用 jiffies 计数器这个计数器和用来读取它的工具函数包含在,通常只需包含 ,它会自动放入linux/jiffies.hjiffies和jiffies_64必须被当作只读变量#include <linux/jiffies.h>unsigned long j, stamp_1, stamp_half, stamp_n;j = jiffies; /* 读取当前时间值 */stamp_1 = j + H原创 2021-08-09 20:57:24 · 201 阅读 · 0 评论 -
高级字符设备的一些补充
<linux/fs.h>loff_t (*llseek) (struct file *, loff_t, int);llseek方法实现了lseek和llseek接口方法如果没定义这个方法的话默认修改filp->f_pos(当前读写位置)如果定位操作对应物理操作则必须实现llseek方法例子:loff_t (*llseek) (struct file x, loff_t off , int y){ struct scull_dev *dev = filp->p..原创 2021-08-09 19:28:22 · 71 阅读 · 0 评论 -
非阻塞IO
非阻塞IO头文件<linux/poll.h>pollselectepoll (2.5.45引入)(千个文件描述符)三个方法都通过unsigned int (*poll) (struct file *, poll_table *)驱动调用主要为2步处理1.在一个或多个可指示poll状态变化的等待队列上调用poll_wait如果当前没有文件描述符可用来执行IO,则内核将使进程传递在文件描述符的等待队列上2.返回一个用来描述操作是否可以立即无阻塞执行的位掩码传递给poll方法原创 2021-08-02 20:45:19 · 191 阅读 · 0 评论 -
幻数魔数
魔数幻数为了不与系统其他设备宏定义冲突,造成错误调用后能正常Linux 第一个版本使用了16位整数,(幻)高8位与设备相关,(魔)低8位是序列号码ioctl-number.txt内罗列了内核设备所使用的幻数<linux/ioctl.h><asm/ioctl.h>type幻数number魔数 序数,顺序编号direction数据传输方向 _IOC_NONE(没有数据传输) _IOC_READ(读取)size所涉及的用户数据大小#define _...原创 2021-06-16 22:29:25 · 242 阅读 · 0 评论 -
kernel 并发和竞争
信号量和互斥体kmalloc可能会引发睡眠信号量(减少信号量值获取锁定状态)信号量就是一种睡眠锁如果一个任务试图获取一个已经被占用的信号量,他会被推入等待队列,让其进入睡眠。此刻处理器重获自由,去执行其他的代码。当持有的信号量被释放,处于等待队列的任务将被唤醒,并获取到该信号量。<asm/semaphore.h>初始化信号量方法1struct semaphore sem;sema_init(&sem, val);初始化信号量方法2DEFINE_SEMAPHORE(原创 2021-05-23 19:06:10 · 126 阅读 · 0 评论 -
字符驱动
<linux/cdev.h>struct cdev { struct kobject kobj; //内嵌的内核对象 struct module *owner;//内核模块的对象指针 const struct file_operations *ops;//向上提供的接口 struct list_head list;//已经向内核注册的所有字符设备形成链表 dev_t dev;//设备号 unsigned int count;//次设备号个数}...原创 2021-05-23 17:33:50 · 224 阅读 · 0 评论 -
linux 传参解析过程
bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrcrootfstype=ext3console=ttySAC2,115200 控制台使用串口2,波特率115200.root=/dev/mmcblk0p2 rw根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是读可写的init=/linuxrc linux的进程1(init进程)的路径rootfstype=ext3 根文件系统的类型是ext...原创 2021-04-11 17:01:03 · 456 阅读 · 0 评论 -
Linux内核简单启动流程以及功能描述
/arch/arm/kernel/head.Ssvc mode irqs disabledget processor id/arch/arm/kernel/head-common.S\arch\arm\include\asm\procinfo.h\arch\arm\kernel\asm-offsets.c__lookup_processor_type CPU信息的定义都放到.proc.info.init段中CONFIG_XIP_KERNEL 是否片内执行\arch\arm\kernel\.原创 2021-04-11 15:53:08 · 181 阅读 · 0 评论 -
linux内核SPI总线驱动(二)
上一节讲到了spi_register_master注册SPI控制器驱动这一节描述调用spi_register_driver注册spi_driver,通过与device匹配驱动设备。使用m25p10a举例spi_register_driver功能跟名称一样根据传入的spi_device参数,可以找到对应的spi_master。接下来就可以利用spi子系统为我们完成数据交互了。定义了prob函数在prob里向上提供接口即可spi_de...原创 2020-07-05 13:48:01 · 634 阅读 · 0 评论 -
linux内核SPI总线驱动(一)
今天我们分析一下SPI驱动的东西,老方法,我们反向追踪,数据手册端上来总线地址是0xC005B000顺藤摸瓜:kernel\kernel-3.4.39\arch\arm\mach-s5p6818\include\mach\ s5p6818.h继续寻找到\kernel\kernel-3.4.39\arch\arm\mach-s5p6818\ devices.c这里看出来spi注册为平台总线的形式,那我们按照平台总线继续往下找通过.nam...原创 2020-06-27 14:14:09 · 615 阅读 · 0 评论 -
linux内核I2C总线驱动(三)
I2c的应用编写,这里我不叫驱动编写哈。上次我们分析了i2c的来源,我们应该看看,系统给我们提供了什么,同时配合官方手册来做讲解欧克~最讨厌的是很多东西他不在H文件里在C文件里\kernel-3.4.39\drivers\i2c\i2c-core.ci2c_verify_client—返回参数i2c_client,或NULL dev: device,可能在遍历驱动模型树时从某个驱动模型迭代器返回,可能使用驱动模型迭代器如@device_for_each_child(),...原创 2020-06-21 14:45:46 · 813 阅读 · 0 评论 -
linux内核C阶段分析(二)
上一章我们看到setup_nr_cpu_ids();我们继续往下看:setup_per_cpu_areas 是为了对内核的内存管理(mm)进行初始化而调用的函数之一smp_prepare_boot_cpu();arch-specific boot-cpu钩子不知道干啥的后面可以看一下build_all_zonelists(NULL);建立节点和内存区域之间的关系page_alloc_init();内存初始化printk(KERN_NOTICE ...原创 2020-06-14 19:00:07 · 244 阅读 · 1 评论 -
使用某为开发板,在项目过程中遇到的坑,记录一下,希望以后不会遇到
某为的开发板有这样一处lcd电源控制如图下面是关于这个ao3415A的手册和官方的说法:我们可以看到,这个管子是典型的Pmos管,官方的文档也写得很清楚是pmos,其内部的二极管方向是D到S,那么我们从原理上分析,此处G不管是高电位还是低电位都不会影响pmos的导通,也就是说下方的电路,其核心是远远不能控制这个供电部分的。按照官方的说法R74是默认焊接的,先不说大电流流过0欧姆电阻可不可行,我们为了看看这个说法是否正确,做了如下仿真:这里根据他的说法默认链接的R74,我们链接一个原创 2020-06-13 16:19:50 · 250 阅读 · 0 评论 -
linux内核I2C总线驱动(二)
上回书讲到:注册具有静态总线号的i2c适配器的函数,这样就能够使用我们后面的i2c_adapter等方法了啦。idr_get_new_aboveidr机制整数id与指针建立关系i2c_register_adapter注册i2c适配器注册了adapter这回我们来继续分析kernel-3.4.39\drivers\i2c\i2c-core.c这里主要是你编写的设备驱动,去和总线关联的,所以他管理着怎么匹配主要经历了bus_register(&...原创 2020-06-07 14:27:50 · 328 阅读 · 1 评论 -
linux内核I2C总线驱动(一)
一般外面讲的i2c都是怎么去写驱动端和设备端,我们今天来详细说明一下,整个的框架,从调用soc内部的地址开始,告诉你是怎么来的,应该怎么修改,去适配自己的soc开始吧!主要学习的是分析代码的思路直接看源码太麻烦了,我们先看一下soc手册怎么说的,以我手头的6818为例子手册下载中。。。load。。。我们按照这个总线地址去源码追一下看看kernel-3.4.39\arch\arm\mach-s5p6818\include\mach\s5p6818.h#defi...原创 2020-05-31 18:07:16 · 343 阅读 · 0 评论 -
linux内核C阶段分析(一)
今天开始就进入C语言阶段了Asmlinkage#define asmlinkage CPP_ASMLINKAGE#ifdef __cplusplus#define CPP_ASMLINKAGE extern "C"#else#define CPP_ASMLINKAGE#endif还有一种说法是#define asmlinkage __attribute__((regparm(0))) 作用是不使用寄存器传递参数,强制让参数走堆栈__init...原创 2020-05-31 12:19:03 · 243 阅读 · 0 评论 -
linux内核汇编阶段总结
PSR_F_BIT 0x00000040PSR_I_BIT 0x00000080SVC_MODE 0x00000013PHYS_OFFSET RAM的起始物理地址kernel-3.4.39\arch\arm\mach-s5p6818\include\mach\memory.h#define PHYS_OFFSET CFG_MEM_PHY_SYSTEM_BASEkernel-3.4.39\ar...原创 2020-05-24 15:51:29 · 148 阅读 · 0 评论 -
linux内核汇编阶段分析(三)
接着上一篇r1 =机器号,r2 = atags或dtb,r8 = 偏移地址 r9 = cpuid, r10 = procinfo这个函数主要是检测参数或者设备树的有效性的tst r2, #0x3 @ aligned? r2指向该参数链表的起始位置,此处判断它是否字对齐bne 1f 不对齐的话就返回0了ldr r5, [r2, #0] 把r2加载到r5cmp r5, #ATAG_CORE_SIZE...原创 2020-05-24 00:48:41 · 256 阅读 · 0 评论 -
linux启动流程之汇编阶段(二)
详细分析内核汇编段代码内核启动入口点,这通常是从解压代码中调用的。要求是:MMU关闭,D-cache关闭,I-cache无关,r0为0,r1机器编号,r2为atags或dtb指针,这段代码大部分是位置无关的,所以如果你链接内核在0xc0008000,__pa(0xc0008000)转换为物理地址调用它。参见linux/arch/arm/tools/mach-types获得r1机器枚举的完整列表。我们尽量把垃圾降到最低;不要在这里添加任何特定于机器的垃圾——这就是引导加载程序(或者在极端、合理的情原创 2020-05-23 17:37:31 · 323 阅读 · 0 评论 -
linux启动流程之汇编阶段(一)
从源头开始分析启动。问题linux如何编译的? 从哪里启动?寻找linux的编译脚本Makefile在kernel\kernel-3.4.39\arch\arm\boot\compressed下的Makefile。$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \ $(addprefix $(obj)/, $(OBJS)) $(lib1funcs)...原创 2020-05-17 17:33:10 · 507 阅读 · 0 评论 -
linux官方用户手册
linux官方用户手册有html和pdf两个版本,按需下载原创 2020-05-05 18:37:36 · 898 阅读 · 1 评论 -
最新交叉编译工具链的获取
由于最新的QT等应用都需要高的GCC和G++版本,很多朋友还在为找编译工具链发愁,这里分享一下linaro : https://www.linaro.org/Linaro,一间非营利性质的开放源代码软件工程公司,主要的目标在于开发不同半导体公司系统单芯片(SoC)平台的共通软件,以促进消费者及厂商的福祉。由ARM、飞思卡尔、IBM、Samsung、ST-Ericsson及德州仪器(TI...原创 2020-04-27 21:59:05 · 468 阅读 · 0 评论 -
前言
学习linux很长一段时间了,在学习过程中也没做什么详细的笔记什么的,我深知学习中的不易,准备重新追一下源码和各种驱动的学习,在此处记录下来,希望对bang帮助。...原创 2020-04-27 21:27:23 · 92 阅读 · 0 评论