- 博客(33)
- 资源 (54)
- 收藏
- 关注
原创 Linux驱动怎么在Android上使用
最近有Android的项目,学习下在Android上调用Linux驱动的开发流程,找到两个不错的资源。 推荐一篇文章和一个视频: 文章:Android硬件抽象层(HAL)概要介绍和学习计划 视频:Android HAL编程实战 都讲得很好,浅显易懂。 ...
2021-10-14 17:14:46 1330
原创 正点原子阿尔法imx6ull的wm8960声卡驱动表层简析
文章目录前言1、设备树配置2、打印信息分析(按打印先后顺序)2.1、wm8960_i2c(Codec)2.2、fsl-sai(Platform)2.3、card 注册(Machine)3、总结前言平台:正点原子阿尔法开发板imx6ull内核:4.1.15 参考链接:DroidPhone的音频子系统 为了更好地分析和查看,把CONFIG_DYNAMIC_DEBUG 宏打开了,并且修改了 dev_dbg() 的定义,如下所示:#if defined(CONFIG_DYNAMIC_DEBUG)
2021-03-21 23:18:18 3482
原创 ES8396声卡配置
平台:openwrt主控:mt7620a内核:3.18.23简述:由于wm8974停产,需要将声卡替换为es8396。需求如下:12.288M晶振输入到声卡MCLK脚,声卡es8396作为Master输出BCLK和LRCK时钟SDP1与主控I2S交互声卡DAC输出到MONOOUT和LROUT麦克风输入到声卡MIC再到ADC支持常见码率,48K、44.1K、32K、24K、16K、8K配置代码(亲测可用)不说废话,直接上配置//Powerup snd_soc_write(c.
2021-03-09 11:12:08 1606
原创 不定长参数宏,printf默认打印文件名、函数名和行号
#include <stdio.h>//#define PRTINT_LOG(fmt,args...) printf("in FILE:"__FILE__"->%s"",at [%d]"fmt,__FUNCTION__,__LINE__,##args);#define PRTINT_LOG(fmt,args...) do{printf("FILE:[%s] --> [%s] --> LINE:[%d]:"fmt,__FILE__,__FUNCTION__,__LINE
2020-12-08 10:22:35 393
原创 Source Insight4.0变量自动高亮显示
选择Options==> File Type Options…== ==>勾选Highlight references to selected symbol
2020-11-09 10:00:43 459
原创 Linux内核设计与实现——读书笔记(15)调试
调试1、oops1.1、ksymoops1.2、kallsyms2、引发bug打印1、oops 内核通过oops告知用户有错误的事件发生。这个过程包括:向终端上输出错误信息、输出寄存器中保存的信息和输出可供跟踪的回溯线索。通常,内核发送完oops之后会处于一种不稳定状态。当故障发生时,内核必须适当地从当前的上下文环境中退出并尝试回复对系统的控制。多数时候这种尝试都会失败:如果oops发生在中断上下文中时,内核会陷入混乱(死机);如果oops在idle进程(pid为0)或init进程(pid为1)时发生
2020-10-09 15:13:05 331
原创 Linux内核设计与实现——读书笔记(14)设备与模块
设备与模块1、设备类型2、模块2.1、构建2.1.1、放在内核源码树中2.1.2、放在内核源码树外2.3、模块默认路径2.4、depmod2.5、加载模块2.6、模块参数2.7、导出符号表3、设备模型1、设备类型 除了常见的字符设备、块设备、网络设备和杂项设备外,还有一些虚拟的设备,它们被称为“伪设备”。例如,随机数发生器(通过/dev/random和/dev/urandom访问)、空设备(通过/dev/null访问)、零设备(通过/dev/zero访问)、满设备(通过/dev/full访问)和内存设
2020-09-29 09:54:00 726
原创 ALSA声卡驱动(二)声卡创建
文章目录ALSA声卡驱动(一)初识alsa目录文章目录1、声卡实例1.1、struct snd_card1.2、struct snd_devide2、声卡的创建流程2.1、创建一个声卡实例2.2、创建声卡芯片的专用数据2.3、设置Driver和ID和名字2.4、创建声卡的功能部件(逻辑设备)2.5、注册声卡3、snd_card_create()和snd_card_new()4、snd_card_register()总结1、声卡实例1.1、struct snd_card snd_card可以说是整
2020-09-23 19:18:03 1206
原创 Linux内核设计与实现——读书笔记(13)页高速缓存和页回写
页高速缓存和页回写1、缓存方式1.1、读缓存1.2、写缓存2、缓存回收2.1、最近最少使用算法1、缓存方式1.1、读缓存 当进程发起一个read()系统调用时,内核开始一个读操作:首先回去检查需要读取的数据是否在页高速缓存中。如果在(缓存命中),则放弃访问磁盘,直接从内存中读取;如果数据没有在页高速缓存中(缓存未命中),内核必须调度块I/O操作从磁盘读取数据。然后内核将读来的数据放入页高速缓存中,后续相同的数据都可以直接命中。1.2、写缓存 写缓存有三种策略:(1)、不缓存(nowrite
2020-09-22 21:39:28 291
原创 Linux内核设计与实现——读书笔记(12)进程地址空间
进程地址空间1、地址空间2、内存描述符2.1、分配内存描述符1、地址空间 每个进程都有一个32位或者64位寻址的地址空间。就32为寻址来讲,尽管进程可以寻址4GB(232)的虚拟内存,但是这并不意味着进程就有权访问所有的虚拟内存。每个内存区域具有相关权限,如果一个进程访问了不在有效范围内的内存区域,或以不正确的方式访问了有效地址,内核就会终止该进程,并返回段错误。 通常,内存区域包含的内存对象如下:可执行文件代码的内存映射,称为代码段(text section);可执行文件的已初始化全局变量
2020-09-19 16:15:25 660
原创 Linux内核设计与实现——读书笔记(11)块I/O层
块I/O层1、块和扇区2、缓冲区和缓冲区头3、bio结构体 系统中能够随机访问固定大小数据片的硬件设备称为块设备,这些固定大小的数据片称为块。常见的块设备包括硬盘、软盘驱动器、蓝光光驱和闪存等。它们都是以安装文件系统的方式使用的——这也是块设备一般的访问方式。 字符设备仅仅需要控制一个当前位置,而块设备访问的位置必须能够在介质的不同区间前后移动。所以内核为块设备的管理提供了一个子系统,字符设备就没有了。1、块和扇区 块设备最小的可寻址单元——扇区。扇区大小必须是2的整数倍,常见的为512字节。
2020-09-14 20:31:30 443
原创 Linux内核设计与实现——读书笔记(10)虚拟文件系统VFS
@TOC 虚拟文件系统为用户空间提供了文件和文件系统的相关接口。通过虚拟文件系统,程序可以利用标准的UNIX系统调用对不同的文件进行读写操作,无需考虑文件存在于什么样的文件系统和存储介质中。 ...
2020-09-09 20:39:09 540
原创 Linux内核设计与实现——读书笔记(9)内存管理
内存管理1、页2、区3、页操作函数3.1、分配页3.2、释放页4、kmalloc()4.1、gfp_mask标志4.1.1行为修饰符4.1.2、区修饰符4.1.3、类型标志1、页 内核把物理页作为内存管理的基本单位。内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理,按照页大小的单位来管理系统中的页表。 内核用struct page结构表示系统中的每个物理页,结构定义在 **<linux/mm_types.h>**中:/* page部分的部分成员
2020-08-28 15:11:18 1105
原创 Linux内核设计与实现——读书笔记(8)时间管理
时间管理1、节拍率:HZ1.1、高HZ的优势1.2、高HZ的劣势2、jiffies3、硬时钟和定时器3.1、实时时钟RTC3.2、时钟中断处理程序二级目录三级目录 内核中有大量的函数都是基于时间驱动的。例如对调度程序中的运行队列进行平衡调整或对屏幕进行刷新等。除此之外,内核还必须管理系统的运行时间以及当前如期和时间。1、节拍率:HZ 系统定时器的节拍率是通过宏HZ静态定义的,在 <asm/param.h> 中。1.1、高HZ的优势 高HZ的同时会有高频率的时钟中断会带来如下优点:
2020-08-13 15:53:22 430
原创 Linux内核设计与实现——读书笔记(7)内核同步方法
同步1、原子操作1.1、原子整型操作API函数1.2、原子位操作API2、自旋锁2.1、自旋锁操作API3、读写自旋锁1、原子操作 原子操作只能保证原子性,顺序性通过屏障指令来实现。 atomic_t类型用于32位原子操作,本质是一个被封装的int。64位类型使用atomic64_t,本质是一个被封装的long类型。1.1、原子整型操作API函数 定义在<asm/atomic.h>中。64位API为atomic64 开头。 API描述A
2020-08-11 10:31:38 365
原创 Linux内核设计与实现——读书笔记(5)中断
中断1、注册中断处理函数2、释放中断处理函数3、中断处理函数1、注册中断处理函数 如果设备使用中断,则相应的驱动程序就要注册一个是中断处理程序。 驱动程序通过request_irq() 函数向内核注册一个中断处理程序。intrequest_irq(unsigned int irq, irqreturn_t (*handler)(int, void *), unsigned long irqflags, const char * devname, void *dev_id)
2020-07-30 22:57:03 535
原创 Linux内核设计与实现——读书笔记(3)系统调用
目录1、系统调用1.1、系统调用号1.2、1、系统调用1.1、系统调用号 在Linux中,每个系统调用都被赋予一个系统调用号。当用户进程执行一个系统调用的时候,这个系统调用号就会用来指明到底是要调用哪个系统调用。进程不会提及系统调用的名称。 系统调用号一旦分配不能更改,即使删除了也不允许回收再利用。 :Linux有一个“未实现”系统调用 sys_ni_syscall() ,它除了返回 -ENOSYS 外不做其他操作。这个错误号专门针对无效的系统调用而设置。 内核记录了所有已注册过的系统
2020-07-23 16:34:42 206
原创 Linux内核设计与实现——读书笔记(2)进程调度
目录1、进程调度1.1、Linux调度算法1.2、I/O消耗型和处理器消耗型的进程1.3、进程优先级1、进程调度1.1、Linux调度算法 2.6.23内核版本开始采用以“公平调度” 为概念引入的调度程序——“完全公平调度算法”,简称CFS。1.2、I/O消耗型和处理器消耗型的进程 I/O消耗型进程 大多用于交互,类似鼠标、键盘、用户界面应用程序之类的。 处理器消耗型 进程会把大多时间用于执行程序上。 还有一些程序可以同时处于I/O消耗型和处理器消耗型 ,例如sshkeygen和MAT
2020-07-22 14:20:53 762
原创 Linux内核设计与实现——读书笔记(1)内核特点、进程和线程
1、内核开发的特点1.1、内核和应用编程的差异 主要差异包括以下几种:(1)、内核编程时既不能访问C库也不能访问标准的C头文件。(不过大多数C库函数在内核中已经实现<linux/xxx.h>)(2)、内核编程时必须使用GUN C。(3)、内核编程时缺乏像用户空间那样的内存保护机制。(4)、内核编程时难以执行浮点运算。(5)、内核给每个进程只有一个很小的定长堆栈。(6)、由于内核支持异步中断、抢占和SMP(对称多处理"Symmetrical Multi-Processing"简
2020-07-20 21:06:51 858
原创 U-Boot-1.1.6顶层Makefile分析(三)————make all
U-Boot-1.16 Makefile分析第二篇,按照make all的思路来分析。一边分析一边画思维导图。 正常的make操作是先make xxx_config,在make all。不管了,先写make all的,后面再写xxx_config的。1、执行make allALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)all: $(ALL) u-boot.srec为S-Rec
2020-07-14 20:32:15 718
原创 U-Boot-1.1.6顶层Makefile分析(二)————make xxx_config以及mkconfig脚本
如果要编译某个板子的uboot,那么通常的命令流程是: make xxx_config make all 以smdk2410为例,分析下make smdk2410_config的过程。1、执行make smdk2410_config smdk2410_config在顶层Makefile中的定义如下:smdk2410_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
2020-07-10 20:48:17 364
原创 linux 源码中__asm__ __volatile__作用
Linux源码中有很多使用__asm__ __volatile__的地方,如果在一些应用上需要较为高速的处理,最好用带汇编的函数,例如IO端口的in和out。链接: 格式说明参考.链接: 格式参考,有几个例子.链接: 汇编指令速查.链接: 内存屏障....
2020-07-08 23:31:06 352
原创 U-Boot-1.1.6顶层Makefile分析(一)
笔者对Makefile不熟,一点一点分析代码,要是出错了麻烦各位大佬在评论指出。感激不尽。第一篇,先把Makefile前面的变量和环境分析完吧。分析到all目标,然后后面的就跟着make时的流程走应该会比较好理解。VERSION = 1 PATCHLEVEL = 1SUBLEVEL = 6EXTRAVERSION =U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)VERSION_FILE
2020-07-01 20:10:54 425
原创 U-Boot学习记录
U-Boot小点记录第一篇博客,记录下U-Boot小点,这个编辑器要顶格可真麻烦。—————————————————————————————————————————————参考:《嵌入式linux应用开发完全手册》CPU上电后,MIPS的CPU会从0XBFC00000取第一条指令,ARM的CPU会从0X00000000开始,Uboot就存放在这个地址处;U-Boot有加载模式(从存储设备加载操作系统)和下载模式(利用串口或网络从服务器主机下拉系统镜像)两种操作;嵌入式linux系统的典型分区结
2020-06-29 09:40:09 4421
libjpeg-turbo-2.0.1.tar.gz
2021-10-14
connman-1.36.tar.xz(普通资源,通通5币)
2021-10-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人