USB与BT HID reports描述符实践与抓包分析

文章内容提示 这篇文章主要说明如何获取与查看USB和BLE HoGP HID设备报告描述符,如何根据获取的描述符读懂report。然后说明了可以使用hidrd-convert工具,来如何根据hex报告描述符转化得到C语言格式的描述符,这对于我们编码是有意义的。 其中,还截取了USB 逻辑分析仪,Wireshark等工具来查看input report。 如何看懂HID report descriptor 对于如何看懂HID报告描述符,几乎离不开下面的这两个pdf: USB HID Usage Table USB HID Spec 先看文档(USB HID设备)弄明白一些基本概念:

Continue reading »

结合Yocto Qemu与Eclipse单步调试开发Linux Kernel

使用说明 在以前的博客中说明过使用Qemu + BuildRoot来构建一个虚拟的嵌入式开发平台, 还写过使用Yocto + Qemu来构建一个Cortex-A9的嵌入式开发调试平台. 同时在很久以前也写过使用Eclipse + JLINK来调试ARM9. 而在工作学习中,有时候, 对内核源码的研究中, 需要单步对linux内核跟踪调试, 且大部分是关注与内核中某些组件的实现, 例如MM, Binder驱动, 这个时候直接使用Qemu + Eclipse来调试与开发就比使用硬件方便快捷得多了. 那么这篇文章中将使用:

Continue reading »

Ubuntu 14.04与16.04(Linux Mint或者Debain)内核与模块编译

编译Ubuntu的内核, 如果按照官方的说明, 那么一般是编译出deb包, 然后安装,但是如果我们改了驱动, 或者内核那么我们很可能只想编译bzImage而不是重新生成deb包. 一般的编译步骤 参考Ubuntu 的wiki: Kernel Compile BuildYourOwnKernel 基本步骤如下 安装需要的软件包, 或者kernel source:

如果还需要menuconfig之类的话, 安装ncurse即可. 然后需要chmod脚本

Continue reading »

使用Buildroot与Qemu学习ARM linux IIC驱动

Buildroot配置 下载最新的buildroot,然后进入 buildroot中进行配置

进入到Kernel配置与选择子项目中进行版本选择,使用4.04版本的Linuxkernel,因为低版本的3.3内核不合适学习的3.4.2内核的I2C驱动。如下图: 配置完成后save,关闭。 Kenrel配置 使用make linux-menuconfig打开内核的menuconfig配置选项 1. 选中i2c-adapater与slave,完成对IIC的支持:

  2. 同时Kernel不用dtb,在选择使用dtb 配置好了后,直接make -j4,编译生成各个需要的文件 Qemu模拟Mini2440的构建 启动qemu Mini2440的nand文件制作,可以参考Qemu

Continue reading »

DTB Device Tree 视频教程:以瑞萨Cortex-A15为例

上个月初在组内进行了Device Tree 的知识共享交流,主要讲解了一下: Device Tree引入导致的变更 如何在dts中添加一个device node 与Device Tree相关的API有哪些 下面是思维导图的截图: 最后是视频,不需要什么专门播放器与密码,下载或者保存到自己的网盘即可直接播放,如果有错误,请大家多多包涵与评论指出。 点击访问:百度网盘连接地址  密码:2cpd 或者在Youku中观看,注意选择超清观看 第一部分视频: 第二部分视频:

Continue reading »

Linux设备驱动开发基础之互斥与同步基础

一些概念 竟态:多个执行路径对同一资源进行操作时可能引发的资源混乱行为(①)。执行路径为并发源。 临界区:对共享资源的访问代码片段。临界区只能是在一个进程内部而无法跨进程,因为其不是一个对象,我们无法定义一个临界区对象来告知其他进程,而像Mutex和SpinLock都可以。参考这篇文章。 中断和抢占:一般都是在中断需要返回前会调用重新调度函数,如果没有禁止抢占,那么就会被高优先级的进程抢占。有的地方可以被中断但是进程必须不被抢占,那么只需要禁止抢占就行了。例如spin_lock是可以被中断的,但是不能被抢占,因为被其他进程抢占后会造成死锁。当然因为中断中也可能要去获得这个锁而造成死锁,这个就是spin_lock_irq的来由。 原子操作与原子变量 原子操作:每一步都是不可分割的。 原子变量:对此变量的操作(增加或者减小)是原子操作。 单核处理器+抢占 与 多核处理器在许多发面有类似的特性。 并发的来源 中断 调度器的可抢占性 多核、多处理器的并发执行 中断 一般对于本地CPU(就是此刻运行这个代码的CPU或者CPU核),控制其中断使用的函数是: local_irq_enable local_irq_disable 调度器的可抢占性 调度器的控制函数:

Continue reading »

Linux驱动开发之内存管理基础

内存管理主要分为: 物理内存管理 虚拟内存管理 物理内存管理 页 物理内存以页(page frame)为单位,一般为4K,如果是4G的内存那么,将会有一个大小为4G/4K=1M的数组mem_map,每一项保存着每一页的地址。 Zone Zone是一些连续物理页的合集,参看下面的图3-2。将物理页分成了3个Zone区: ZONE_HIGHMEM:物理内存高于896M的区域 ZONE_NORMAL:常规内存区域,如果DMA可以在此区域做内存访问,也可以使用这块区域 ZONE_DMA:0~nM,不同的架构和不同的芯片都可能不一样 因为数组mem_map与物理页对应,因此mem_map也被默认分为了上面三个区域。 内存节点 分为两种: UMA:只有一个内存节点,CPU访问内存的内存的任何地址的速度是一样的。 NUMA:多个处理器,每个处理器都有自己的本地内存,通过总线通讯。访问本地内存比访问其他节点的内存快。 物理页面分配器:伙伴系统 伙伴系统的特征与作用: 使用物理页为单位

Continue reading »

SPI Nor Flash

SPI协议 Slave与Master 一般而言,提供clock的一方称为master。如下图(7-1)中的SCLK方向可知:Processor为master,而Peripheral为slave。 SPI设备接口 SPI uses four main signals: Master Out Slave In (MOSI) Master In Slave Out (MISO) Serial

Continue reading »

Speed up Booting Embedded System

嵌入式产品的启动时间一般是一个指标,像大部分Android手机几乎没有为启动加速做过优化,可以改进的地方非常多。当然因为Android用得最多的地方是手机,难得冷启动一次。 用户从按下电源键开始,看到启动logo或者启动动画到出现可操作的Home/App画面,需要的时间越少,自然越好,产品的竞争力也越强。 一般没有系统的嵌入式设备启动都是上电即进入正常工作流程,这里只说linux/Android及类似的系统;下面将会简单的说明和列举从启动流程到各个启动过程都可以使用的方法,以及快速启动。 ☞启动流程 要做启动时间优化,需要对启动过程非常熟悉。下面从启动流程说起。 不同的嵌入式设备启动流程很可能不一样,但是绝大部分的linux/Android设备都是一样或者类似的。  ❤图片来源于:http://processors.wiki.ti.com/index.php/Optimize_Linux_Boot_Time ☞工具准备: 串口行间数据计时工具Grabserial的安装与使用 因为依赖python的serial模块,先安装它,在Ubuntu中安装python-serial:

获取工具脚本:

添加可执行权限:

设置以U-boot字符串出现为基准计时的使用示例:

如果要同一行内部计时,例如解压kernel的时候是在一行内的,可以使用-i选项:

我们从MMC出现时开始计时,以下为实例log,其中第一列为从出现指定字符串开始的计时,第二列为与上一行log的间隔:

Continue reading »