自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 wsl下安装交叉编译问题解决

因为我的交叉编译工具是32位的,所以win10下的wsl没法使用 使用如下命令 arm-none-linux-gnueabi-gcc -v 会出现下面的告警 /usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc: line...

2020-05-23 00:19:14 194 2

原创 嵌入式linux单板上开启telnet功能

第一步,在文件系统中开启,开启这些命令。当然一般是开启的(busybox-1.28.4) Networking Utilities ---> ...... [*] telnet (8.7 kb) ...

2019-06-15 18:27:18 1157 0

原创 从零开始之驱动开发、linux驱动(七十一、电容触摸屏驱动)

一、电容式触摸屏检测原理 基本原理是利用充电时间检测电容大小,从而通过检测出电容值的变化来获知触摸信号。电容屏的最上层是玻璃(不会像电阻屏那样形变),核心层部分也是由ITO材料构成的,这些导电材料在屏幕里构成了人眼看不见的静电网,静电网由多行X轴电极和多列Y轴电极构成,两个电极之间会形成电容。触...

2019-05-08 22:58:28 1867 0

原创 从零开始之应用发开、linux应用(三、应用调试之打印错误)

使用gdb调试,可以发现一些我们理解错误的逻辑问题,一般情况下我都是使用gdb进行调试的。 但有时我们的应用程序很大,我们不知道哪里出的问题,即gdb调试不知道在哪里打断点(当然也可以单步或者自己定几个断点),这个时候就需要有别的方法来找到出错的大概位置。 假设我们在程序中,对为初始化的指...

2019-05-06 21:19:40 476 0

原创 从零开始之应用发开、linux应用(二、应用调试之gdb)

Linux中包含一个很强大的调试工具GDB(GNU Debuger),可以用它来调试C和C++程序。 什么是GDB? GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。 问题:既然windows下有对...

2019-05-05 22:01:54 568 0

原创 从零开始之应用发开、linux应用(一、应用调试之strace)

strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序。 在Linux系统中,用户程序运行在一个沙箱(sandbox)里,用户进程不能直接访问计算机硬件设备。当进程需要访问硬件...

2019-05-02 22:15:26 783 0

原创 从零开始之驱动开发、linux驱动(七十、4.19内核nfs挂载只读问题的延伸)

之前移植的3.16.57版本的内核,使用2018年7月的busybox自己构建的这个根文件系统。 使用3.16.57版本的内核用nfs挂载,这个根文件系统是一个可读可写的内核。 但后面为了学习设备树,移植了4.19版本的内核,发现文件系统成了只读的文件系统。 开始是怀疑我pc上了nf...

2019-05-02 21:32:35 314 0

原创 从零开始之驱动发开、linux驱动(六十九、内核调试篇--内核卡死分析)

内核卡死有很多种可能, 驱动程序因为逻辑问题,出现死循环 共享资源出现死锁 系统跑飞等 一般情况下,系统跑飞内核会打印Oops信息。 有了Oops信息,我们就可以通过上一节的方法来推断出出错位置。 而死锁或者驱动程序死循环并不会打印Oops信息。 这个时候需要我们自己打印出来,出错...

2019-05-01 19:43:50 552 0

原创 从零开始之驱动发开、linux驱动(六十八、内核调试篇--Oops解析)

什么是Oops? 从语言学的角度说,Oops应该是一个拟声词。当出了点小事故,或者做了比较尴尬的事之后,你可以说"Oops",翻译成中国话就叫做“哎呦”。“哎呦,对不起,对不起,我真不是故意打碎您的杯子的”。看,Oops就是这个意思。 在Linux内核开发中的Oops是什么...

2019-05-01 15:42:15 343 0

原创 从零开始之驱动发开、linux驱动(六十七、内核调试篇--printk使用)

printk的使用我们在内核,驱动调试的时候使用的非常多 比如前面在调试usb驱动的时候 #include <linux/init.h> #include <linux/usb/input.h> #include <linux/hid.h> stat...

2019-05-01 12:25:16 432 0

原创 从零开始之驱动发开、linux驱动(六十六、内核调试篇--printk原理)

上一节我们已经看到了console的注册,prink的基础就是console,所以本节我们主要看内核中prink的实现。 /** * printk - print a kernel message * @fmt: format string * * This is printk(...

2019-04-30 21:59:20 1375 0

原创 从零开始之驱动发开、linux驱动(六十五、内核调试篇--串口驱动)

上一节我们分析了bootoader中传过来的cmdline中的命令是如何解析并执行的。 同时也是对bootloader中传过来的console进行了记录。 console也就是我们所说的控制台,可以是任何常见的输出设备,比如serial,比如framebuffer,比如网口。 本节主要以...

2019-04-24 00:25:57 471 0

原创 从零开始之驱动发开、linux驱动(六十四、内核调试篇--基础知识2[console的建立])

上一节我们分析的earlay的printk知识,本节主要分析一下在内核启动后的printk的知识。 主要是通过下面函数实现的 after_dashes = parse_args("Booting kernel", static_command_line, __...

2019-04-21 23:50:38 203 0

原创 从零开始之驱动发开、linux驱动(六十三、内核调试篇--基础知识1[earlyprintk建立过程])

我们知道,内核中使用__section设置了很多的段属性,使用段属性可以很方便的对函数调用时间分层。 比如我们之前常见的subsys_initcall,就要比module_init更早的执行,因为subsys_initcall在驱动中通常是bus和class,驱动程序调用执行需要class和bu...

2019-04-21 18:09:44 250 0

原创 linux设备模型十四(hotplug和mdev使用)

mdev有两个主要的用途:初始化常用设备和动态更新。这两个用途都要需要内核的sysfs的支持并且需要把sysfs挂载到/sys。对于动态更新来说,你也需要开启内核的热插拔功能。 以下是几个典型的代码段,从初始化脚本摘录: [0] mount -t proc proc /proc [1...

2019-04-20 14:15:05 412 0

原创 linux设备模型十三(mdev原理)

udev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,两者的实现机理不同。 udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作,包括创建/删除设备节点,加载/卸载驱动模块等...

2019-04-18 23:02:56 528 0

原创 linux设备模型十二(热拔插hotplug)

我们知道,一个最简单的字符设备驱动应该是下面这个形式。 #include <linux/fs.h> #include <linux/init.h> /* 定义一个open函数 */ static int first_drv_open(struct inode...

2019-04-15 00:24:58 602 0

原创 从零开始之驱动发开、linux驱动(六十二、PL330 DMA控制器驱动)

pl330 dma驱动比较复杂,最近没时间研究这个的细节。这个稳定暂留,后面补上。

2019-04-14 20:07:51 274 0

原创 从零开始之驱动发开、linux驱动(六十一、PL330 DMA控制器)

一、DMA介绍 首先简单介绍下什么是DMAC(Direct Memory Access Controller),DMAC 是一个自适应先进的微控制器总线体系的控制器,它由ARM公司设计并基于PrimeCell技术标准,DMAC提供了一个AXI接口用来执行DMA传输,以及两个APB接口用来控制这个...

2019-04-14 00:02:01 421 0

原创 从零开始之驱动发开、linux驱动(六十、ARM AMBA总线介绍)

AMBA片上总线 AMBA总线: AMBA总线是ARM研发的(Advanced Microcontroller Bus Architecture)提供的一种特殊的机制,可以将RISC处理器集成在其他IP芯核和外设中,它是有效连接IP核的“数字胶”,并且是ARM复用策略的重要组件。它不是芯片与外...

2019-04-12 23:09:39 369 0

原创 从零开始之驱动发开、linux驱动(五十九、linux4.19的IIC驱动的编写和使用3)

本节不需要编写驱动,直接可以使用i2c-dev中编写号的驱动,来进行使用。 也就是说这是一个完全的应用程序。 程序在后面的代码仓库。这里说一下原理。 正常情况下,每一个adaptor,都会在i2c_dev_init函数调用时创建一个设备在/dev/i2c-x 这要求一个前提,ada...

2019-04-08 22:11:51 304 0

原创 从零开始之驱动发开、linux驱动(五十八、linux4.19的IIC驱动的编写和使用2)

下面说的这种方式其实和前面的很相似 1.在设备树文件中,设备所在的i2c总线下面定义好设备 &i2c0 { status = "okay"; eeprom@50 { compatible = "atmel,24c0...

2019-04-08 19:48:49 255 0

原创 从零开始之驱动发开、linux驱动(五十七、linux4.19的IIC驱动的编写和使用1)

第一点,配置内核支持i2c Device Drivers ---> I2C support ---> <*> I2C device interface [*] Autoselect pert...

2019-04-06 00:35:01 319 0

原创 从零开始之驱动发开、linux驱动(五十六、linux4.19的IIC驱动adaptor的注册)

上一节我们看到下面这函数了。 /** * i2c_add_adapter - declare i2c adapter, use dynamic bus number * @adapter: the adapter to add * Context: can sleep * * Th...

2019-04-02 00:06:15 228 0

原创 设备树学习(二十三、aliases节点分析)

在设备树中有一个叫做aliases的节点: / { #address-cells = <1>; #size-cells = <1>; aliases { csis0 = &csis0; fimc0 = &fimc0; fimc1 =...

2019-04-01 23:00:02 1176 0

原创 从零开始之驱动发开、linux驱动(五十五、linux4.19的IIC驱动adaptor)

前面用了8节内容已经分析了2.6.35.7内核的iic驱动,可以发现,在linux中iic驱动还是稍微有些复杂的。 在linux4.19内核中,其实百分之85~90还是和2.6内核的一样的。 关于4.19的i2c,我大概会用两三节来进行分析,主要还是对硬件这个设备树引入后的变化分析。 唯...

2019-04-01 00:06:09 285 0

原创 从零开始之驱动发开、linux驱动(五十四、linux2.6下的IIC总结[8])

2.6.35.7内核的iic设备已经分析完毕了。 我们这里做一下总结。 首先linux下注册iic设备的方式是有五种的。 这里我们对每一种的注册和顺序进行简单总结。 这里我们的参考资料如下 Documentation/i2c/instantiating-devices 第一种方式...

2019-03-31 18:47:08 175 0

原创 从零开始之驱动发开、linux驱动(五十三、linux下的IIC设备驱动cdev[7])

i2c-dev.c文件完全可以被看作是一个I2C设备驱动, 不过, 它实现的i2c_client是虚拟、 临时的, 主要是为了便于从用户空间操作I2C外设。 i2c-dev.c针对每个I2C适配器生成一个主设备号为89的设备文件, 实现了i2c_driver的成员函数以及文件操作接口, 因此i2c...

2019-03-31 15:07:25 135 0

原创 从零开始之驱动发开、linux驱动(五十二、linux下的IIC设备驱动[6])

I2C设备驱动要使用i2c_driver和i2c_client数据结构并填充i2c_driver中的成员函数。 i2c_client一般被包含在设备的私有信息结构体中, 而i2c_driver则适合被定义为全局变量并初始化。 这种驱动通常是相对稳定的驱动程序,通常不需要改动。 下面给出内...

2019-03-31 14:22:00 193 0

原创 从零开始之驱动发开、linux驱动(五十一、linux下的IIC总线的通讯方法[5])

我们需要为特定的I2C适配器实现通信方法, 主要是实现i2c_algorithm的functionality() 函数和master_xfer() 函数。 functionality() 函数非常简单, 用于返回algorithm所支持的通信协议。 linux中定义了一下方法 /* To ...

2019-03-31 13:07:41 195 0

原创 从零开始之驱动发开、linux驱动(五十、linux下的IIC适配器的注册[4])

由于I2C总线控制器通常是在内存(寄存器)上的, 所以它本身也连接在platform总线上, 要通过platform_driver和platform_device的匹配来执行。 因此尽管I2C适配器给别人提供了总线, 它自己也被认为是接在platform总线上的一个客户。 Linux的总线、 设备...

2019-03-31 00:18:19 169 0

原创 从零开始之驱动发开、linux驱动(四十九、linux下的IIC核心层的接口[3])

I2C核心中的主要函数如下: (1) 增加/删除i2c_adapter int i2c_add_adapter(struct i2c_adapter *adap); void i2c_del_adapter(struct i2c_adapter *adap); 增加一个adadptor ...

2019-03-30 21:22:46 220 0

原创 从零开始之驱动发开、linux驱动(四十八、linux下的IIC核心层的建立[2])

I2C核心(drivers/i2c/i2c-core.c) 中提供了一组不依赖于硬件平台的接口函数, 这个文件一般不需要被工程师修改, 但是理解其中的主要函数非常关键, 因为I2C总线驱动和设备驱动之间以I2C核心作为纽带。 首先看一下i2c核心层的创建函数。 static int __...

2019-03-30 12:40:05 217 0

原创 从零开始之驱动发开、linux驱动(四十七、linux下的IIC框架【1】)

I2C总线仅仅使用SCL、 SDA这两根信号线就实现了设备之间的数据交互, 极大地简化了对硬件资源和PCB板布线空间的占用。 因此, I2C总线非常广泛地应用在EEPROM、 实时钟、 小型LCD等设备与CPU的接口中。 如果在裸机情况下直接操作I2C,其实很简单,只要正确把握IIC的操作时序...

2019-03-30 11:31:19 391 0

原创 从零开始之驱动发开、linux驱动(四十六、IIC协议原理)

IIC协议是一个板级异步双向的串行协议。 只使用一根数据一根时钟两根线,通常频率都不会很高,通常我们使用在几百Khz,目前最高的器件能达到Mhz级别。 IIC协议的缺点:数据线只有一根既要主机传输又要从机传输,所以传输速度很慢。 主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此...

2019-03-28 23:39:03 276 0

原创 从零开始之驱动发开、linux驱动(四十五、DM9000网卡驱动)

这里我们肯定不是要从零开始编写网卡驱动的。 因为编写网卡驱动时,需要网络基础知识,特别是网络底层的知识,目前还没学。 将来我可能选择在,网络,图像视屏,或USB这个三个方向,选择一个深入钻研。 这里主要对一个真实的网卡的框架进行分析,底层和物理寄存器或网络协议相关的就略过。 4.1...

2019-03-27 23:41:10 739 0

原创 Git使用学习(二十二、团队协作冲突的解决)

但凡是团队合作,就一定会出现冲突。 假设项目经理张小龙在它的本地改了一个bug之后,推送到了远程库。 这时项目组的小张肯定不知道项目经理的推送,更不知道项目经理张小龙改了那个位置的内容。 此时假设小张也修改了这个位置,此时也向远程库推送自己的修改。此时因为出现冲突,小张推送会失败。 此时小...

2019-03-26 22:52:58 281 0

原创 Git使用学习(二十一、远程库github操作[4]拉取)

上一节中,项目组员,小张已经把自己的本地库的内容推送到了远程库github。 本节项目负责人张小龙,准备把远程库的内容拉取到他的本地。然后检查无误后把远程库合并到他的本地开发中。 可以看到,拉取之前文件里面的内容是wechat 0.1 version 当然,拉取(fetch)或(...

2019-03-26 22:18:18 226 0

原创 Git使用学习(二十、远程库github操作[3]邀请加入团队和push)

上一节我们学习到,项目组成员,因为没有被邀请加入团队,所以不能向远程库推送自己的本地更改。 这里开始我们就让项目的负责人,邀请项目组成员加入这个项目。 下面给出操作步骤 输入邀请人的github账号 邀请创建后,可以看到,已经有了协作人的信息 ...

2019-03-26 21:32:59 344 0

原创 Git使用学习(十九、远程库github操作[2]clone)

上一节中项目经理张小龙先生已经把自己搞的WeChat 0.1版本放到了远程仓库了。 接下来WeChat项目组的成员,小张需要把远程库的0.1版本的WeChat clone到他的本地。然后进行增加功能。 这里我们换一个方式。使用Windows下的git来实现,成员小张的所有操作。 小张...

2019-03-26 00:25:13 96 0

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