自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(154)
  • 资源 (13)
  • 收藏
  • 关注

原创 andriod硬件访问硬件服务框架--流程(思维导图)

安卓多个应用程序的时候 同时访问硬件 会造成冲突 所以就是用 server框架写server的框架 有些复杂 就用流程图 表示出来大概开发应用程序的时候 就是这个流程图 后面 有详细开发按按理-----led server框架开发...

2020-03-02 01:51:27 1888 2

原创 10_9_fbbuffer整体框架流程

这个文章只是大概流程,很难讲的细分为两部,第一部分是 整个框架怎么跑的第二部分是 lcd手册的参数 和soc上lcd控制器的参数 和驱动中需要的参数 到底有什么映射关系fbbuffer的思想是 应用空间有图像需要 拷贝到驱动空间 如果是cory_To_usr 效率就很低如果驱动空间能直接映射一块内存(肯定是驱动分配的)到用户空间 mmap 映射到用户空间应用程序直接写这个地址就会快很多了。

2023-12-10 20:34:06 847

原创 10_7iic整体框架流程

在内核中 这边把iic整个流程分成了 4层iic_dtiver at24_iic_eeprom 也就是我们的自己的驱动i2c-core.c 核心层i2c/busses/i2c-s3c2410.c 控制器层平台总线驱动层,或者也是图中的设备树。

2023-11-27 00:27:37 953

原创 10_6 input输入子系统,流程解析

举个例子在input_hadler这一层 我们看的是evdev.c这个万能驱动 起始还有mousedevhandler mousedev.c鼠标handler 和joydey_handle游戏杆的handler。所以鼠标设备会和 evdev.c匹配 也会和鼠标handler匹配 所以鼠标插入的时候 有个/dev/input/event0 和 /dev/input/mouse0。我们看到handler层的注册的结构体 input_handler evdev_handler。

2023-11-19 22:30:04 549

原创 10_4阻塞和非阻塞跟poll和等待队列

那驱动使用 wait_event_interruptible(key_dev->wq_head, key_dev->have_data);再次调用到驱动中的poll,这时候检测到右数据,那么驱动poll,会返回POLL_IN这些掩码。再次调用到驱动中的poll,这时候检测到右数据,那么驱动poll,会返回POLL_IN这些掩码。应用先 poll(pfds, 2, 5000);

2023-10-29 15:18:20 163

原创 10.2手动推导linux中file, cdev, inode之间的关系

是时候可以手动推导一下linux里面基类父类和子类的关系了代码放最后把。

2023-10-15 20:50:48 375

原创 07_03文件系统怎么玩的

文件对象通过域f_dentry找到它对应的dentry对象,再由dentry对象的域d_inode找到它对应的索引节点(通过索引节点又可以得到超级块的信息,也就可以得到最终操作文件的方法,在open文件的时候就是使用这样一个过程),这样就建立了文件对象与实际的物理文件的关联。f_op也是很重要的!我们看到,Linux系统的文件目录树就是靠上图中的这一系列的链表穿针引线给串在一起的,就像缝制一件衣服一样,最终的成衣就是我们看到的Linux系统目录树,而缝制这件成衣的线以及指导走线的规则便是VFS本身了。

2023-10-14 12:02:46 257

原创 02_静态链接和简单宕机分享

栈顶保存的是自己的FP(栈底)栈顶+8 处保存的是LR寄存器的值,也就是自己return后要从哪里开始执行。也叫该函数返回的下一条指令的地址然后保存的是局部变量的值。然后,保存的是从n,…,3,2,1 ,从低往高,的传参的值。到上一个函数的FP为止,函数的栈结束。这就是一个完整的栈帧。

2023-10-01 15:08:52 328

原创 04_22 vma(进程下的每个虚拟内存区域查看)对象实战

vma不太懂的可以往前翻03_008内存映射原理_虚拟内存区域vm_area_struct详解,和mmap系统钓调用及物理内存结构体完全分析vam 虚拟内存区域 每个进程下有多个vma 这次是查看每个vma的起始地址 结束地址和大小使用1.进程在用户空间调用mmap也就是上面那个函数。2.在当前进程的地址空间当中寻找一段连续的空虚的虚拟地址3.给这块虚拟地址分配一个vm_area_struct的结构并对其各个区域进行初始化。

2023-09-03 15:44:13 228

原创 04_21 slab分配器 分配对象实战

mycaches"的slab描述符,小为40字节, align为8字节, flags为0。从这个slab描述符中分配个空闲对象。在目录 /proc/sys/slab 查看刚刚创建的slab对象。( slab块分配器分配内存),编写个内核模块,创建名称为。

2023-08-27 22:51:36 136

原创 04_20 直接使用代码 创建内核模块获取物理内存信息

好像和 free得出来有关 和/proc/meminfo 有关。但是下面是全部的物理页。

2023-08-27 18:29:35 90

原创 04_19linux自己撸内存池实战,仿造slab分配器

自己撸一个内存池 其实就相当于linux里面带的 slab分配器 可以翻翻之前的章看看slab 和伙伴分配器的不同在学习c语言时,我们常常会使用到malloc()去申请一块内存空间,用于存放我们的数据。刚开始我们只要知道申请内存时使用用malloc去申请一块就可以,而其中的原理我们并不关心。但是随着我们对运行环境的要求越来越多样化,复杂化,以及对稳定性以及性能问题的要求逐渐变得越来越重要时,我们往往需要关注到性能问题。

2023-08-27 16:49:01 411

原创 04_18内存反碎片技术,什么时候适合进行内存碎片整理

内存碎片分为内部碎片和外部碎片,内部碎片指内存页里面的碎片,外部碎片指空闲的内存页分散,很难找到一组物理地址连续的空间内存页,无法满足超过一页的内存分配请求。

2023-08-20 23:55:27 129

原创 04_17页回收问题和水位线和swap交换空间和oom,内存性能微调

应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler (缺页中断函数)处理。缺页中断处理函数会看是否有空闲的物理内存,如果有,就直接分配物理内存,并建立虚拟内存与物理内存之间的映射关系。扯到之前的内存分配了。

2023-08-20 17:32:00 238

原创 04_15页表缓存(TLB)和巨型页

linux里面每个物理内存(RAM)页的一般大小都是4kb(32位就是4kb),为了使管理虚拟地址数变少加快从虚拟地址到物理地址的映射 建议配值并使用HugePage巨型页特性。

2023-08-19 15:12:59 1423

原创 04_14缺页异常,虚拟空间加深印象,匿名页,文件页

写代码想知道某段时间内存够不够用 想更清楚高低水位 清楚虚拟ram和物理ram的关系CPU通过地址总线可以访问连接在地址总线上的所有外设,包括物理内存、I0设备等等, 但从CPU发出的访问地址并非是这些外设在地址总线上的物理地址,而一个虚拟地址,由MMU将虚拟地址转换成物理地址再从地址总线上发出,MMU上的这种虚拟地址和物理地址的錾关系是需要创建的,并且MMU还可以设备这个物理面是否可以进行写操作,当没有创建一个虚拟地址到物理地址的映射,或者创建了这样的映射,

2023-08-13 23:34:50 114

原创 03_013内存分配api以及页表详解

之前文章中物理ram中的最小单位一直用页来表示这次又描述的详细了点物理ram的最小单位 有的地方叫 块,框,页帧 在虚拟空间中最小单位也叫页 需要好好区分不过后来想想管你虚拟页还是物理ram页 都存在物理ram上 都能想成一 一对应的关系 所以大家都叫页好像也行。

2023-08-13 17:14:55 154

原创 03_012slab块分配器,管理内核内存分配,管理高速缓存

伙伴系统的实现是为了减少物理内存碎片化,每个zone通过自己的伙伴系统减少内存碎片。slab分配器使得内存重复利用,减少物理内存的分配和释放。即通过slab分配器减少了物理内存的碎片化。在Linux中除了slab分配还有slub、slob分配器。他们都是通过缓存对象,来减少实际内存的分配和释放。在linux中通过伙伴系统管理大内存,slab管理小内存。Linux通过这套体系减少了物理内存的碎片化。

2023-08-07 00:48:03 171

原创 03_010物理内存ram分配器,内存区域页分配及水位线等分析

伙伴系统(Buddy System)是一种管理物理内存的算法,主要于管理大块的内存区域,如页框。伙伴系统通过将大的内存块不断分割成两个较小的伙伴块,然后按照块大小将伙伴块归入不同的空闲链表中,以便快速找到符合要求的内存块。伙伴系统通常用于分配物理内存,由于内核中的物理内存总量比较有限,因此在分配物理内存时需要考虑内存碎片的问题。而slab则是用于管理内核对象的内存分配器。它的设计目的是为了提高内核对象的内存分配效率,减少内存碎片,提高内存分配的速度。

2023-08-06 18:03:22 246

原创 03_使用execle表生成甘特图

1.在做开发功能的时候能知道什么时候进行开始 2.大概需要做多久 3.一个星期两天放假1天处理产线实际只有4天能跑完开发 有时候会更久。项目中一个大块能拆分成很多子任务 每个子任务迭在一起就是完成一个task花费的时间。这个的开始日期的格式需要选对 不然就会有提示说不对 自己生成1988年的日期。结束日期等于 该子任务开始日期+需要完成的时间 同时给每个任务和子任务带上排序。当前子任务开始日期等于上一个子任务开始日期 + 上一个子任务需要完成的时间。需要的数据有项目开始时间,每个子任务花费的时间。

2023-07-30 21:43:13 219

原创 03_008内存映射原理_虚拟内存区域vm_area_struct详解,和mmap系统钓调用及物理内存结构体完全分析

上一个记录中的 虚拟地址里的虚拟内存区域没有说的很完全这次补充一下 同时记录一些 物理地址空间 内存映射原理 最后直接通过进程使用函数完成虚拟空间到物理空间的映射1、mmap0----创建内存映射为什么要使用mmap映射呢 直接读写文件不香吗???1.系统调用mmap():进程创建匿名的内存映射,把内存的物理页映射到进程的虚拟地址空间。2.进程把文件映射到进程的虚拟地址空间,可以像访问内存一样访问文件,不需要调用系统调用read()/write()访问文件,

2023-07-15 21:50:53 522

原创 03_007linux内存管理架构以虚拟内存空间布局架构(用户地址空间+内核地址空间)

malloc()/free()是 glibc库的内存分配器ptmalloc提供的接口,在内存碎片化的时候,申请连续物理页的成功。MMU包含一个页表缓存, 保存最近使用过的页表映射,避免每次把虚拟地址转换为物理地址都需要查询内存中的页表。当内存碎片化的时候,找不到连续的物理页,内存碎片整理通过迁移方式得到连续的物理。如果使用新的指针 p_new 接收 sbrk 系统调用返回的堆内存指针 , 则分配的是新的地址;比较低,可以申请不连续的物理页,映射到连续的虚拟页,即虚拟地址连续而物理地址不连续。

2023-07-10 01:09:07 977

原创 02_06内核cpu信息及内存布局及堆管理及内存使用情况

虚拟地址也同样最大支持48位寻址,所以在处理器架构设计上,把虚拟地址空间划分为两个空间,每个空间最大支持256TB,如果虚拟地址对应的物理页不在物理内存这时候产生一个缺页中断,此时分配一个真正的物理地址,此时更新一些进程页表 如果此时物理内存已经耗尽,会根据内存替换规则的算法设计,删除一些页面保存。堆是进程中主要用于动态分配变量和数据的内存区域,堆的管理对应程序员不是直接可见的。用户空间使用malloc 系统空间使用brk()是系统调用,实际是设置进程数据段的结束地址,将数据段的结束地址向高地址移动。

2023-07-09 17:50:13 316

原创 02_05链表调度使用RCU机制,防治优化建立内存屏障

RCU优势是读线程没有任何同步开销:不需要获取任何的锁,不需要执行原子指令,不需要执行内存屏障。2、CPU执行优化:提高流水线的性能,CPU的乱序执行可能会让后面的没有寄存器冲突和汇编指令先于。RCU记录所有指向共享数据的指针的使用者,当要修改该共享数据时,首先创建一个副本,所有读访问线程都离开读临界区之后,指针指向新的修改后副本的指针,并且。1、编译器优化:提高系统的性能,编译器在不影响逻辑的情况下会调整指令的顺序。将新的链表元素new添加到表头为head的链表头部, 而list_

2023-07-03 00:17:17 429

原创 02_04_02实时调度类_线程优先级代码实战

普通调度策略(SCHED_ NORMAL/SCHED_ BATCH/SCHED_ _IDLE) ,始终返回0,即普通任务调度的函数。SCHED OTHER它不支持优先级使用,而SCHED RR/SCHED FIFO支持优先级使用,它们分析为1-99, 数值越大优。备注:如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主。实时调度策略(SCHED_ FIFO/SCHED_ RR) 优先级最大值为99;SCHED_ OTHER分时调度策略;

2023-07-02 17:46:26 120

原创 02_04实时调度类及SMP多核处理器的实时操作系统体系结构

上一篇文章说的是普通进程的调度但同时还有实时进程在linux上面进行运行这边来看看实时进程在linux里面怎么调度 同时linux操作系统对实时任务的处理方式和设计思想。

2023-07-02 16:54:29 303

原创 01.2总线驱动设备设计思想

每个bus下面都有dev和drv两个目录里面的链表把和这个bus相关的 设备与驱动都链接起来 使用bus.match每当有新的drv注册的时候主动调用 当两个名称匹配的时候 bus也提供了probe函数 一般这个函数后面直接指向dev的probe函数。这样写尽管也可以做的驱动对不同设备的兼容,但是耦合度比较高。当目录下面的文件有关系的时候(比如iic总线目录下的多个设备)我们使用key_set把这些目录进行链接。总线:总线是CPU和设备进行信息交互的通道,所有的设备都要连接到总线上。

2023-06-24 21:50:00 302

原创 01.4进程原理和系统调用--->经典的CFS调度器

操作系统作为硬件的使用层,提供使用硬件资源的能力,进程作为操作系统使用层,提供使用操作系统抽象出的资源层的能力。进程:是指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。sched_class结构体表示调度类,定义在kernel/sched/sched.h。

2023-06-24 15:09:44 360

原创 编译过程杂记

static如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加 static内部函数又称静态函数。使用内部函数,可以使函数的作用域只局限于所在文件。即使在不同的文件中有同名的内部函数,也互不干扰。提高了程序的可靠性。外部函数如果在定义函数时,在函数的首部的最左端加关键字 extern,则此函数是外部函数,可供其它文件调用。C 语言规定,如果在定义函数时省略 extern,则默认为外部函数。

2023-05-21 17:16:23 446

原创 05_从0运行,重定位,初始化,中断再到定时器

这边简单讲讲,代码上电后从0开始发生了什么,为什么要重定位把代码复制到sdram,bin文件前面几条跳转函数都跳转去哪 中断产生后发生什么。

2023-05-01 17:13:21 609

原创 02_2440soc_内存地址映射和选择,寄存器地址的选择

大多数arm芯片从0开始启动nand_flash控制器外接nand_flash 256Mcpu直接接nor_flash 2Mnor_flash启动时候 nor_flash上面烧了bin文件 nor_flash基地址为0cpu直接读nor上的第一个指令(前4字节),执行cpu继续读取其他指令 执行如果使用nor启动,片内的sram的地址就是 0x4000,0000nand_启动 片内4kram 基地址为0()cpu都从0开始启动。

2023-04-16 18:46:42 467

原创 03_2440_裸机时钟体系

这里soc从外界得到外部时钟源,通过硬件的锁相环(PLL)进行加速,加速完的内部时钟通过分频为三个时钟源 cpu_fclk ahb_hclk apb_pclk给不同的器件进行使用MPLL后得到时钟频率放入clkcntrl里面,直接作为FCLK传给cpu经过HDIVN分频,得到HCLK,经过AHB总线传给各种高速设备经过PDIVN分频,得到DPIVN,传给APB总线各种低速外设。

2023-04-02 22:33:58 131

原创 13_pinctrl子系统

pinctrl作为驱动iomuxc节点在设备树里面 存储全部所需的引脚配置信息。

2023-03-05 21:35:08 364

原创 06_spi子系统

和i2c框架图类似 spi控制器也会当作spi设备 挂在spi总线上面SPI核心层提供SPI控制器驱动和设备驱动的注册方法、注销方法、SPI通信硬件无关接口SPI主机驱动主要包含SPI硬件体系结构中适配器(spi控制器)的控制,用于产生SPI 读写时序主要数据结构:spi_master(spi_controller)SPI设备驱动通过SPI主机驱动与CPU交换数据主要数据结构:spi_device和spi_driver。

2023-02-05 21:04:08 388

原创 05_驱动中异步处理数据,流水线工人

比如06中的spi驱动,因为是异步处理数据避免堵塞这时候把线程当作一个工人,分派任务,分配处理任务的方法。

2023-02-05 15:07:12 396

原创 09_输入子系统

这里学的不是很透彻,只是知道和设备树没太大关系,用中断实验的设备节点就好在中断实验的驱动多创建 输入设备结构体并且初始化 有中断的时候上报一下就没了在07_按键中断驱动中 初始化的时候找个地方 申请一个输入子系统结构体 用系统提供的api进行简单初始化中断处理函数中使用 input_event()上报输入事件,后续交给系统的input核心层进行事件的分发就行。

2023-01-27 18:10:33 614

原创 07_linux中断控制

分为 gic中断控制器设备树节点 其他外设中断控制器节点 需要使用中断的设备节点。设置iomux 给这个gpio_5_1 设置为普通io 输入 用来检测信号。想在button_interrupt节点使用 gpio5管理的中断类型。有些外设和中断关系密切,这时把这个外设节点也作为一个中断控制器节点。这样可以用这个外设节点对某一个具体的中断进行管理。dev:传递给中断处理函数的第二个参数。gic中断控制器在设备树里面的节点。禁止中断,等待中断执行完毕。禁止中断,不等待中断执行完。irq:要释放的中断号。

2023-01-27 16:19:04 810

原创 04_iic子系统

iic_client和iic_driver 加入iic总线的思想和paltform总线的玩法一样把iic设备和驱动注册到iic总线中 构造出字符设备驱动和设备节点供app进行操作但是iic硬件设备是挂在iic控制器下面的 所以iic控制器也会有自己的驱动和设备树节点 厂家一般都会帮做好我们写的iic_driver驱动程序 控制iic硬件的时候 使用iic总线提供的api 来控制iic硬件设备详细介绍分两部分 一个是iic驱动程序 一个是iic控制器驱动介绍。

2023-01-23 23:51:52 1185

原创 00_linux 设备驱动模型 2.6以后通用模型

自定义一个总线 叫x-bus在里面增加dev和drv 匹配成功后 调用drv的probe进行基本的设备文件创作和设备节点创作/sys/bus/xbus 自己生成的总线,和IIC这边匹配类似自定义总线dev /sys/bus/xbus/device/zzz自定义总线drv /sys/bus/xbus/drv/zzzbus_register(struct bus_type * bus) //添加新的总线类型 device_register(struct device);

2023-01-23 23:50:29 1320

原创 02_gpio子系统

驱动程序还想控制gpio 可以不用读写寄存器 直觉用gpio子系统开发的接口就能用了轻松做输入输出 获取当前值gpio1 记录了控制器相关的寄存器基地址//初始化外设时钟 gpio - controller;//表明gpio1是gpio控制器 # gpio - cells = < 2 >;//表明gpio1是中断控制器 # interrupt - cells = < 2 >;//表明gpio1和pinctrl子系统关系 gpio子系统引脚编号和pinctrl子系统引脚编号的关系 }

2023-01-22 22:05:26 1123

my_tslib.zip

rk3128 触摸屏不能匹配qt解决,重新编译好的 tslib库,上arm直接运行

2021-02-03

6818_work.7z

arm板上通过内核实现可滑动的电子相册,已经编辑好了,直接用// 建立一个空结构体 struct fb_var_screeninfo vinfo; bzero(&vinfo, sizeof(vinfo)); char *fbmem = init_lcd(&vinfo); ``` 给结构体通过 ioctrl 获得相关参数 ```c char *init_lcd(struct fb_var_screeninfo *vinfo) { int lcd = open("/dev/fb0", O_RDWR); ioctl(lcd, FBIOGET_VSCREENINFO, vinfo)

2020-11-29

6818_mjpg.tar.bz2

想对s5p6818进行摄像头(支持uvc)进行使用,把得到的视频放入web端 嫌烦直接拿我的用就好啦 mjpg_stream网上的移植过程很多,但是发现源码失效了,而且用最新的源码进行编译,有些地方也会出错

2020-11-17

imx6null 移植华为云,交叉编译openssl

imx6null 移植华为云,交叉编译openssl,紫

2020-11-09

02 带有上报下发功能.7z(一)使用Django和华为IOT平台通信:初建框架 带有上报下发的 djangoweb

用Django作为app端和iot平台通信 东西就用我之前的写好的web进行改装,在上面对华为iot进行通信,什么数据库,或者版本我也会给出来

2020-09-27

myfile.zip

解决开发板子 ping的通 ip 不能ping 百度的问题 参照我的博客进行 连接 这些文件全部放在etc下就好啦

2020-09-26

电容屏中断和gt9147各种芯片手册.zip

之前玩arm都是电阻屏,但是电容屏更加通用,这次拿ALIENTEK 4.3’LCD进行学习,里面有GT9147驱动IC(相当于控制触摸屏的一个小芯片) 把源码进行修改,从官方给的查询模式触发,变成中断触发,源码可下载,另带找到的芯片手册

2020-09-06

arm_mqtt_c_ok.zip

arm-a上华为iot云,移植虚拟机的文件到开发板,全网首发,### 上一篇文章已经在虚拟机上可以用华为的sdk连接到iot云端 我已经造好轮子,也不收费,希望大家多交流,每次下载点东西,一个两个都要金币的,很难受 现在我们把文件移植到开发板上

2020-06-18

mqtt_c_demo.zip

已经调试好的华为iot--->linux当做物联设备,成功上云包.oT Device SDK Tiny是部署在具备广域网能力、对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报和命令接收等功能,相关集成指导请参见端云互通组件开发指南。

2020-06-16

这次的驱动和makefile和tslib.zip

可以通过环境变量来设置:先设置环境变量后,才能使用触摸屏程序。 export TSLIB_TSDEVICE=/dev/event0 //这是指触摸屏设备。 export TSLIB_CALIBFILE=/etc/pointercal //校验文件放在这里。 export TSLIB_CONFFILE=/etc/ts.conf //配置文件放在这里。 export TSLIB_PLUGINDIR=/lib/ts //插件放在这里 export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 //显示屏 ts_calibrate //是指校验,在 SHELL 中输入这个程序后: 这时屏幕上会出现一些文字,左上角会有个“十字架”。

2020-03-31

输入子系统第四步完成注册后硬件操作.emmx

对应着硬件操作的流程图 #define EV_SYN 0x00 //同步类 #define EV_KEY 0x01 //按键类,如键盘上的 a,b 等按键事件。 #define EV_REL 0x02 //relation 相对位移事件(如鼠标的位移是基于上一个位置的)。 #define EV_ABS 0x03 //ABS 是绝对位移(如触摸屏是 XY 坐标绝对位置)。 #define EV_MSC 0x04 #define EV_SW 0x05 #define EV_LED 0x11 #define EV_SND 0x12 #define EV_REP 0x14 #define EV_FF 0x15 #define EV_PWR 0x16 #define EV_FF_STATUS 0x17 #define EV_MAX 0x1f

2020-03-15

SYS_001.zip

博客所写的代码和编译结果 思维导图

2020-03-03

所需uboot和gcc.zip

4412开发安卓5.0.2 时候本篇文章要的uboot和gcc uboot是4122的 

2020-02-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除