嵌入式Linux驱动
文章平均质量分 85
绿叶清风
这个作者很懒,什么都没留下…
展开
-
Linux USB架构
可以看出一个USB体系需要4个驱动:USB设备驱动(主要编写这部分),USB主控制器驱动,Gadget驱动,UDC驱动。 USB主要有4个功能:MassStorage:大容量存储,如硬盘,U盘。USB-HID:人体接口设备,鼠标,键盘。RNDIS:网卡。CDC-ACM:u转串口。 USB描述符: USB驱动程序位于不同的内核子系统和USB主控制器之间,USB转载 2016-09-12 10:37:17 · 915 阅读 · 0 评论 -
linux驱动LCD 驱动程序代码编写
转自在编写代码之前我们先来看一看原理图 引脚说明:VCLK:发出lcd时钟信号,每来一个时钟,就会在屏幕上显示一个像素 ——GPC1 :配置为lcd引脚VLINE:发出lcd行扫描信号转载 2017-06-17 11:34:16 · 5045 阅读 · 0 评论 -
linux驱动调试之printk的原理
转自1、启动开发板进入uboot输入print命令打印环境变量2、启动参数(上面bootargs部分)uboot的目的是启动内核,启动内核前要设置一些参数,修改启动参数不添加console=ttySAC0(内核打印信息显示的地方)没有内核的任何打印信息出来uboot设置参数,console=转载 2017-06-17 20:42:34 · 2251 阅读 · 0 评论 -
Linux驱动USB驱动程序之概念介绍
现象:把USB设备接到PC1. 右下角弹出"发现android phone"2. 跳出一个对话框,提示你安装驱动程序问1. 既然还没有"驱动程序",为何能知道是"android phone"答1. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone" 提示你安装的是"设备驱动程序"转载 2017-07-01 11:13:12 · 528 阅读 · 0 评论 -
Linux驱动USB驱动程序-USB总线驱动程序
USB主机控制器分为三种,一种是UHCI OHCI EHCIUHCI规范:intel阵营 告诉你怎么做USB这些东西 适用于低速和全速USB设备 低速一般称为USB1.1 全速一般称为USB2.0 inter做硬件比较牛 所以他的硬件比较复杂点,软件比较简单点 OHCI规范:microsoft阵营做出来的东西 适用于低速和全速 微软软件牛逼点,所以它的软件复杂点,硬件简转载 2017-07-01 16:37:31 · 1037 阅读 · 0 评论 -
Linux驱动USB驱动程序之USB设备驱动程序1简单编写
1、驱动编写分析(1)usb总线驱动程序在我们接入USB设备的时候会帮我们构造一个新的usb_device.注册到总线里面来。左边这一块已经帮我们做好了,我们要做的是右边这一块。我们要构造一个usb_driver结构体,然后注册进去。usb_driver结构体里面的id_table表示能够支持哪一些设备,里面的probe函数表示能够支持接入设备时会被调用。(2)目的转载 2017-07-01 17:01:35 · 923 阅读 · 0 评论 -
linux驱动-USB驱动程序之USB设备驱动程序2鼠标用作键盘
1、usbmouse.c(1)probe函数在这个probe函数后判断是不是一个鼠标,先得到usb_host_interface结构体,除了端点0外,端点个数如果不是1,返回错误,表示不是自己能支持的设备。如果只有一个端点,放在endpoint这个数组里面。endpoint[0]是表示除了端点0外的第一个端点。得到它的端点描述符。 如果不是输入(中断转载 2017-07-01 17:03:36 · 679 阅读 · 0 评论 -
linux驱动调试之段错误分析-根据栈信息分析函数调用过程
一. 根据栈信息分析函数调用过程(如果没有回溯信息)在函数调用中,一方面要执行,一方面要跳到返回地址(需要保存返回地址lr(在栈里面保存))# ./firstdrvtest onUnable to handle kernel paging request at virtual address 56000050pgd = c3e78000[56000050] *pgd=0原创 2017-06-10 22:23:06 · 830 阅读 · 0 评论 -
linux应用调试之使用strace命令跟踪系统调用
starce打补丁starce命令及用法使用strace命令来追踪系统调用原创 2017-06-10 22:35:41 · 486 阅读 · 0 评论 -
linux驱动调试之修改系统时钟中断定位系统僵死问题
在first_drv.c中故意引入错误,在点灯时引入死循环,当应用程序调用write函数就会在while里面卡住。重新编译驱动,并拷贝到网络文件系统中,装载驱动并把灯点亮,但是系统卡死了。可以看测试程序的源代码,看涉及什么系统调用,找到对应的驱动程序并进行分析。在系统空间可能会发生这样一种情况:系统僵死!此时系统处于僵死状原创 2017-06-10 22:37:58 · 831 阅读 · 1 评论 -
linux驱动调试之自制工具—寄存器编辑器
转自http://liu1227787871.blog.163.com/blog/static/2053631972012610101614610/当我们调试驱动程序的时候,可能要调整寄存器的设置。按照我们之前的作法就是直接在程序里面修改,然后重新编译程序。但是这种方法比较麻烦,我们可以编写一个工具,可以直接对寄存器进行修改,这就是我们说的寄存器编辑器。其具体程序如下:这个转载 2017-06-10 22:39:34 · 858 阅读 · 0 评论 -
linux驱动调试之段错误分析_根据pc值确定出错的代码位置
我们知道在内核里面不能够处理指向0地址的指针,我们故意引入这样一个指针,并根据打印的出错信息来进行分析,下面是我们的程序:#include #include #include #include #include #include #include #include #include #include int *i;static i转载 2017-06-10 22:42:36 · 3611 阅读 · 0 评论 -
linux应用调试技术之GDB和GDBServer
出自1、调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer。在应用程序调试的时候,pc机上的gdb向开发板上的GDBServer发出命令,而开发板上的gdbserver就会向应用程序发出信号,使应用程序停下来或者完成其他一些工作。 2、安装GDB和GDBServer(gdb转载 2017-06-10 22:44:42 · 592 阅读 · 0 评论 -
应用调试之配置修改内核打印用户态段错误信
出自http://liu1227787871.blog.163.com/blog/static/2053631972012613102341318/根据之前的调试我们知道,当应用程序出错的时候,会打印一些信息。但是有时候这些信息时不够的,那么我们能否配置内核使其输出更多的信息呢?答案是肯定的,本节我们就来详细讲一下:应用程序进入内核态调用驱动程序后,在驱动程序里面(内核态里转载 2017-06-10 22:55:01 · 1018 阅读 · 0 评论 -
linux应用调试之自制系统调用、编写进程查看器(一)
转自http://liu1227787871.blog.163.com/blog/static/20536319720126135157567/一、原理要想自制系统调用,当然首相要做的就是明白系统调用的过程:我们拿open函数来举个例子:当用户空间执行open函数时,会通过glibc函数库的作用最终去调用sys_open函数,sys_open函数最终又会调用我们具体转载 2017-06-11 08:20:58 · 666 阅读 · 0 评论 -
应用调试之自制系统调用、编写进程查看器(二)
出自:点击打开链接在本节里面我们就详细来讲一下如何用我们自己实现的系统调用来调试应用程序一、步骤1、修改应用程序的可执行文件,替换某个位置的代码为swi val2、执行程序3、进入到sys_hello->在sys_hello里面打印信息->执行原来的指令->返回二、具体实现我们的应用程序是://file:test_sc.c#inclu转载 2017-06-11 15:57:19 · 701 阅读 · 0 评论 -
STM32可用的QRCODE二维码生成库
近期的一个项目中要用到qrcode来传送一些讯息,因此跑去找了下方法顺便问问其他人,大多数都是PY或者Java的类库,C语言少得可怜。最后找到了这个库,在github上开源发布:https://github.com/fukuchi/libqrencode它的作者设计用在Linux上面。是作为可执行文件来运转并产生二维码的,因此试着缩减了一些不用的功能,减去主转载 2017-06-08 10:49:20 · 4994 阅读 · 3 评论 -
linux驱动之nandflash驱动框架
nandflash驱动框架最上层肯定是应用程——————————app: open read write________________文件系统:文件系统是将对文件的读写转换为对块设备的读写—————————块设备驱动块设备 : 知道怎么优化——————nandflash协议层:知道发什么来读原创 2017-06-14 20:38:19 · 739 阅读 · 0 评论 -
linux驱动LCD对对程序之层次分析与框架
在写lcd驱动程序之前,我们必须先要明白lcd驱动程序编写的框架,这点韦东山老师分析的相当详细,让我们来学习一下吧!首先从fbmem.c文件开始。(1)我们先找到入口函数:static int __init fbmem_init(void){proc_create("fb", 0, NULL, &fb_proc_fops);if (register_chrd转载 2017-06-17 11:17:32 · 656 阅读 · 0 评论 -
linux驱动之网卡驱动-虚拟网卡驱动编写
我们来实现这么一个目的我ping 3.3.3.4的时候,按理说如果是真实网卡的话,我们3.3.3.3的机器,和3.3.3.4的机器。ping 3.3.3.4的时候3.3.3.3的机器会把包发给3.3.3.4,3.3.3.4收到包之后又会把包发给3.3.3.3在驱动程序中用netif_rx用这个函数上报包 它就可以ping得通了。但是我们是虚拟网卡,并没有真正的网线,也没有3.3.3原创 2017-06-16 00:44:32 · 1281 阅读 · 0 评论 -
Linux设备驱动第十二天(I2C下)
回顾: 1. linux内核的分离思想 分离硬件和软件 struct platform_device:装载硬件信息 .name 用于匹配 .id 如果有多个,通过id编号 .resource 装载硬件信息 .start .end .fl原创 2017-01-02 19:48:02 · 722 阅读 · 0 评论 -
Linux设备驱动第一天学习笔记(如何将系统在开发板上运行起来、驱动开发基本步骤)
如何将系统在开发板上运行起来? 4.0 交叉编译器的获取?厂家提供 网上下载(厂家确认) 4.1 uboot进行操作? 1,解压厂家源码 2,进入源码 3,make distclean 彻底删除源码的目标、临时文件 4,make xxx_config 针对某个CPU和开发板进行配置 5,make编译 6,结果生成u-boot.bin 7,利用厂家提供的烧写方法进行烧写 8,原创 2016-11-24 17:26:06 · 5106 阅读 · 0 评论 -
Linux设备驱动第二天(数组参数传递,模块相互调用、printk、内核GPIO函数、系统调用)
数据的模块参数声明:/*** 宏的作用:对数组进行模块参数声明,将来可以进行传递一些参数信息进来* name:数组名* type:数组元素的数据类型* nump:有效数组元素个数的指针* 比如定义一个数组的时候,可能只想操作数据中的某些数据* perm:访问权限 跟之前的一样**/module_param_array(name,type,nump,perm);例如:stat原创 2016-11-25 11:47:14 · 2019 阅读 · 0 评论 -
Linux设备驱动第三天(字符设备驱动、cdev)
设备号的分配 静态分配:动态分配:/*** 功能:动态申请设备号* dev:存放返回的设备号的结构体 * firstminor:指定次设备号 * count:连续编号范围* name:编号相关联的设备名称. (/proc/devices)**/int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int原创 2016-11-25 22:23:45 · 711 阅读 · 0 评论 -
Linux设备驱动第四天(自动创建设备节点、LED驱动程序)
回顾: 与驱动有关的几个重要结构体 1,struct cdev //从软件上代表硬件设备 { dev_t dev;//设备号 = 主设备号+次设备号 struct file_operations f_ops; }2,struct file_operations{ open read write release原创 2016-11-26 23:01:45 · 2329 阅读 · 0 评论 -
Linux设备驱动第五天(按键驱动、中断)
回顾: 问题1:简单主设备号、次设备号的用途? 问题2: “mknod /dev/test c 204 64” 这些参数的意义 问题3: 向内核注册一个cdev的编程步骤 问题4:内核空间和用户空间能直接访问吗?如果不能,内核中提供的访问接口有哪些?LED驱动程序 自动创建设备文件: class_create(…); device_create(…);1、按键驱原创 2016-11-27 11:29:00 · 790 阅读 · 0 评论 -
Linux设备驱动第六天(工作队列、定时器、延时)
回顾:linux内核混杂设备。 特点:主设备号由内核分配好,主设备号为10;内核通过次设备来区分各个混杂设备。 数据结构: struct miscdevice{ int minor;//MISC_DYNAMIC_MINON(内核分配) char *name;//设备文件名 struce file_operaionts *fops;//给混杂设备原创 2016-12-25 20:19:06 · 2153 阅读 · 0 评论 -
Linux设备驱动第七天(原子性:中断屏蔽、自旋锁、信号量)
回顾:linux内核底半部的工作队列 明确:linux内核底半部的机制有哪些? tasklet:tasklet对应的延后执行函数工作中断上下文中,并且tasklet本身也是基于软中断实现,所以不能进行休眠操作 工作队列:工作队列对应的延后执行函数工作在进程上下文中,所以可以进行休眠操作 软中断:对应的延后执行函数以不能以模块的形式实现,必须静态编译到内核中;并且要求延后执行函数具备可原创 2016-12-26 15:06:47 · 1020 阅读 · 0 评论 -
Linux设备驱动第八天(等待队列)
回顾: linux内核的并发和竞态: 概念: 并发:多个执行单元同时发生 竞态: 共享资源: 互斥访问: 临界区: 原子性: 内核执行路径:产生竞态的几种情况: 多核: 进程与线程 中断与进程 中断与中断linux内核避免竞态的方法: 中断屏蔽 原子操作 自旋锁 信号量:睡眠锁linux内核等待队列机制: 等待队列机制: 目的:就是让进程在内核原创 2016-12-27 18:27:11 · 498 阅读 · 0 评论 -
Linux设备驱动第九天(非阻塞、内存管理)
回顾: linux内核等待队列机制: 目的:让进程在内核空间进行休眠 为什么要休眠?进程不能直接在用户空间yuk原创 2016-12-29 11:21:35 · 611 阅读 · 0 评论 -
Linux设备驱动第十天(mmap、linux内核分离(软硬分离)思想)
回顾: 1.linux内核如何管理内存 kmalloc kzmalloc __get_free_pages vmalloc vmalloc = 256M mem = 10M GFP_KERNEL GFP_ATOMIC2.1 linux内核地址映射的函数: ioremaplinux内核mmap机制: mmap映射内存必须是页面大小的整数倍!!day 11 am 1原创 2016-12-30 00:23:19 · 1613 阅读 · 0 评论 -
Linux设备驱动第十四天(input子系统、去除抖动)
1,回顾linux内核I2C设备驱动实现过程 内核I2C驱动框架: 应用程序 open,close,read,write,ioctl…..I2C设备驱动: 管理硬件:I2C外设本身; 关注用户操作的数据的特定含义; 不关注这些数据是如何通过总线传输;SUMBUS接口: 给I2C设备驱动使用 I2原创 2017-01-10 21:36:46 · 1226 阅读 · 0 评论 -
Linux设备驱动第十三天(I2C、DS18B20)
回顾: I2C总线: 概念:两线式串行总线 SDA SCL 一个时钟周期传输一个bit位 画简易的连接图问:CPU如何访问I2C总线上的某个外设? 问:CPU如何通过I2C总线实现与外设进行数据交互? 问:SDA与SCL之间如何配合? 答:I2C总线协议上START信号: STOP信号: 设备地址: 读写信号: ACk信号:数据交互以AT24C02读写为例:原创 2017-01-07 01:24:33 · 1699 阅读 · 0 评论 -
U盘升级系统内核
1,U盘如何在开发板上手动使用; 1.1 将U盘插入开发板的USB接口 1.2 查看U盘的设备文件,通过查看U盘在插入USB接口的打印信息 信息: /dev/sda4,/dev/sdb4,/dev/sdc4 ….. 1.3 利用mount命令进行挂接,访问U盘mkdir /mnt/usb //创建挂接目录mount -t vfat /dev/sda原创 2017-01-11 13:55:17 · 987 阅读 · 0 评论 -
linux驱动之nandflash驱动之简单编写
参考内核中driver/mtd/nand/s3c2410.c或者driver/mtd/nand/atmel_nand.c先把头文件包含进去我们来看看nand_scan_ident这里面做了什么事情设置位数,因为我们的数据线只有8位所以这里选八位设置默认函数看看这个怎么设置的原创 2017-06-15 23:45:27 · 570 阅读 · 0 评论 -
linux驱动之NOR FLASH驱动程序
FLASH驱动框架App open,read,write--------------------------------------------------VFS sys_open,sys_read,sys_write--------------------------------------------------FS ----------原创 2017-06-16 00:04:02 · 735 阅读 · 0 评论 -
linux驱动之网卡驱动程序框架
我们这里说的是网卡驱动程序,不是网络驱动程序,网络有七层,我们写的只是最底层的东西,网络这么多层,但是最终你还是要操作硬件啊所以上面肯定有个硬件相关层,我们要写的就是硬件相关的驱动程序这一小块。网卡你不需要打开什么设备,你只需要socket编程就行了怎么写1、分配某个结构体2、设置3、注册4、硬件相关的操作然而这个重点在设原创 2017-06-16 00:26:06 · 1314 阅读 · 0 评论 -
Linux驱动之Nand Flash原理及硬件操作
我们先看下nandflash的布线有data0 到data7 八根数据线nandflash是个存储芯片,那我提出请求:读地址a的数据,把数据b写到a地址上去那么我们看原理图只看到data0-data7,没有看到地址引脚,那怎么把地址传给我们的开发板复用,这几个引脚即传数据也传地址怎么分别是数据还是地址呢,有个ALE信号,当ALE是高电原创 2017-06-14 20:22:11 · 1665 阅读 · 0 评论