Linux 驱动
文章平均质量分 74
Eric_Xi_BJ
热爱嵌入式
展开
-
【无标题】rk3588编译问题
#UsageinputArguments-1-9-d-z-f-h/-H31make[2]make[2]***正在删除文件“arch/arm64/boot/Image.lz4”170make[1]make[1]***正在等待未完成的任务....214makeERRORERROR。原创 2022-07-29 17:03:08 · 3611 阅读 · 2 评论 -
海思3536 nand 扩容操作教程
海思3536开发板默认是256M的nand,在实际的产品中容量远远不能满足需求。根据上层软件的需要,扩容到1G的存储空间。想要系统正常运行,需要以下操作:1.修改Hitool的分区表海思3536 使用Linux双系统:主系统和从系统。主系统主要控制4个A17核心。从系统主要控制A7和多媒体单元。我使用的事主系统来引导 从系统。把所有的应用程序放到了mashter_fs中。修改nand之前住文件系统只有235M硬件扩容到1G后,增加主文件系统到900M2.修改uboo...原创 2021-01-22 14:18:52 · 3803 阅读 · 0 评论 -
Linux 网络驱动 phy 读写寄存器调试方法
Linux 网络 phy 调试方法目前嵌入式芯片支持双网卡的有很多。在调试网络驱动时,需要通过mdc 和mdio信号对phy的寄存器进行操作调试。如果每次调试都修改网络驱动的话会很麻烦。下面提供我常用的网络驱动调试方法在驱动层,设备树绑定mac与mdio总线的关系。在Linux应用层,编写测试程序mdio 。代码如下:如果是写寄存器操作,就传入四个参数./mdio ethX phyId addr value.。ethX 表示是哪个网卡,如eth0 eth1 。phyId是 ...原创 2021-01-21 16:23:50 · 5348 阅读 · 1 评论 -
Linux 内核延时
linux的时间概念:Linux系统定时器是可编程的频率中断处理器,此频率为每秒的定时器节拍数,对应内核变量HZHZ是一个与体系结构相关的常数:Linux为大多数平台提供HZ值范围为50-1200x86 PC平台默认为1000,我们的内核为200内核中有一个非常重要的全局变量:jiffies它是一个无符号32位整数,用来记录自内核启动以来的时钟滴答总数(即每原创 2017-06-01 16:43:08 · 771 阅读 · 0 评论 -
Linux内核定时器--timer_list
定时器:linux操作系统提供了一个内核定时器内核定时器可在未来的某个特定时间点调度执行某个函数,完成指定任务linux内核定时器提供了一种异步处理的机制用户通过设置将来某一时刻的滴答值来实现定时功能假设HZ的值为200,Linux定时器最短定时时间为5ms,小于该时间的定时可直接通过硬件定时器完成定时器使用过程:定时器接口函数介绍:原创 2017-06-01 16:54:07 · 963 阅读 · 0 评论 -
Linux 内核中的并发--概念
基本概念:并发指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态。当多个进程、线程或中断同时访问同一个资源,可能导致错误.进程上下文:应用程序陷入内核运行时所处的内核环境中断上下文:中断服务程序执行时所处的内核环境抢占式内核:用户程序在执行系统调用期间可以被高优先级进程抢占非抢占式内原创 2017-06-01 17:22:32 · 852 阅读 · 0 评论 -
Linux 内核中的并发--中断屏蔽
中断屏蔽(进入临界区之前屏蔽中断,退出临界区之后开启中断):由于进程调度依赖中断实现,因此进程抢占产生的竞态也得以避免;保证中断服务函数不访问临界区;关中断是一种很谨慎的操作,而且长时间屏蔽中断很危险,要细心使用。在SMP多处理器下,该方式就失效了,因为开关中断都是对本cpu的操作中断屏蔽相关函数:local_irq_disable(); //屏蔽所有中断.原创 2017-06-01 17:32:19 · 3645 阅读 · 0 评论 -
Linux 内核中的并发--自旋锁
自旋锁(获取自旋锁->临界区->释放自旋锁)自旋锁的名称源于它的工作原理:尝试获取一个自旋锁,如果锁空闲就获取该自旋锁并继续向下执行;如果锁已被占用就循环检测该锁是否被释放(原地打转直到锁被释放)只有在占用锁的时间极短的情况下使用;不能递归使用一个自旋锁(形成死锁);占用锁时不能使用可能引起进程调度的函数,如copy_xx_user()、kmalloc()、msleep()…自旋锁主要原创 2017-06-01 18:02:41 · 801 阅读 · 0 评论 -
Linux 内核中的并发--信号量与互斥体
信号量(down操作->临界区->up操作)信号量的使用方式和自旋锁类似,进程只有得到信号量才能执行临界区代码但与自旋锁不同的是,当进程获取不到信号量时并不是原地打转而是睡眠等待中断服务函数不能进行睡眠,因此信号量不能用于中断当中,如果中断函数一定要用信号量可以使用尝试上锁(down_trylock)进行操作,不能获取锁就立刻返回,以避免阻塞,通过返回值判读可执行与否原创 2017-06-01 18:16:53 · 1331 阅读 · 0 评论 -
Linux内核异步数据处理--kfifo
引题:在驱动编程中,经常会遇到异步数据处理的情况,比如采用中断或定时器处理数据输入输出等情况此时数据的采集与处理往往不同步,于是驱动编程中数据采集方需要将采集的数据暂时放到一个缓冲区中,使用方在需要处理数据时从缓冲区中将数据读出驱动编程中常采用队列这种数据结构来实现整个过程,我们可以选择自己编写一个队列,也可以利用内核中现有队列kfifo来实现kfi原创 2017-06-01 16:29:23 · 2512 阅读 · 0 评论 -
Linux内核中断底半部--概述
基本概念:在大多数真实的系统中,当中断来临时,要完成的工作往往不能立即完成,而是需要大量的耗时处理。中断处理通常分两个部分:顶半部:一个急切抢占并与硬件交互的顶半部底半部:完成重大工作负载,执行过程中所有中断都是使能的,可被打断。中断的底半部实现机制:软中断(softirq):基本的底半部机制,现在很少使用微线程(tasklet):微原创 2017-06-01 16:06:45 · 617 阅读 · 0 评论 -
Linux kernel 中的轮询操作-select poll
轮询操作:应用程序通常会使用select()系统调用查询是否可对设备进行无阻塞的访问。该函数通过系统调用最终会引发设备驱动中的poll()函数被执行该机制还可以实现一个用户进程对多个设备驱动文件的监测轮询操作应用层接口函数介绍:文件描述符集合的基本操作:文件描述符集合的变量的定义fd_set fds;清空描述符原创 2017-06-01 11:44:21 · 2389 阅读 · 0 评论 -
Linux kernel 中的的等待队列(阻塞式)
等待队列在Linux内核中用来阻塞或唤醒一个进程,也可以用来同步对系统资源的访问,还可以实现延迟功能等待队列接口函数介绍:#include //头文件包含1.定义、初始化等待队列(指向等待队列链表)定义一个等待队列头wait_queue_head_t my_queue;初始一个等待队列头原创 2017-06-01 12:25:27 · 3777 阅读 · 0 评论 -
Linux kernel轮询与等待队列
根据不同需求,linux内核有不同I/O操作模型:非阻塞:进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直到可以进行操作为止阻塞:指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作条件后再进行各项操作等待队列:用来阻塞或唤醒一个进程,实现阻塞I/O访问轮询操作:非阻塞I/O访问的应用程序通常使用select()和poll()系统调原创 2017-06-01 12:09:45 · 830 阅读 · 0 评论 -
Linux 内核 线程
内核线程的概念:内核线程类似于用户进程,通常用于并发处理些工作,它是一种在内核空间实现后台任务的方式,并且可以参与时间片轮转调度内核线程可以进行繁忙的异步事件处理,也可以睡眠等待某事件的发生,内核线程可以访问内核函数和数据结构很多设备驱动程序都是用了内核线程来完成辅助任务,例如:USB设备驱动程序中的khubd内核线程用来监控USB集线器,并在USB被热插拔的时候配置USB设备内核原创 2017-06-01 14:08:10 · 538 阅读 · 0 评论 -
Linux内核信号
内核信号的概念:信号是UNIX进程间通信的一种标准方式,在最早期的UNIX系统中已经存在。我们在系统编程中了解过,信号可以作为进程间通信的一种方式同样我们编写的驱动也可以使用信号通知应用层及其它进程特定事件的发生内核信号的使用:#include //内核信号接口函数头文件#include //current创建一个信号结构体:原创 2017-06-01 14:16:05 · 1300 阅读 · 0 评论 -
Linux内核中断处理
基本概念: Linux操作系统下同裸机程序一样,需要利用中断机制来处理硬件的异步事件但用户态不允许中断事件,因此中断必须由设备驱动程序来接收与处理如果CPU接收到一个中断,它会停止一切工作,调用中断处理函数,因为进程调度依赖中断,此时进程调度也会停止所以就要求我们的中断处理一定要快中断处理程序运行在中断上下文中断处理程序运行在中断上下文中:上下文:内核运原创 2017-06-01 14:58:36 · 669 阅读 · 0 评论 -
Linux内核中断底半部处理--内核微线程
内核微线程使用过程:内核微线程相关函数介绍:#include //头文件包含微线程创建:方法一(采用宏):DECLARE_TASKLET(name, func, data);参数:微线程名称、任务处理函数、任务处理函数的参数/*无需提前定义,直接写上na原创 2017-06-01 15:35:16 · 716 阅读 · 0 评论 -
Linux内核中断底半部处理--工作队列
工作队列的使用过程:工作队列相关函数介绍:#include /*头文件包含*/1.工作队列的创建及销毁:定义一个工作队列结构体指针static struct workqueue_struct *key_workqueue;创建工作队列struct workque原创 2017-06-01 16:05:12 · 3156 阅读 · 0 评论 -
ELF文件和BIN文件
文件的内容:1. BIN文件是 raw binary 文件,这种文件只包含机器码。2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。所以ELF文件的体积比对应的BIN文件要大。文件的执行:1. 执行raw binary很简单,只需要将程序加载到其起始地址,就可以执行; FILE *fp = fopen("vm转载 2016-12-29 10:51:46 · 918 阅读 · 0 评论