- 博客(233)
- 资源 (8)
- 收藏
- 关注
原创 wsl下安装交叉编译问题解决
因为我的交叉编译工具是32位的,所以win10下的wsl没法使用使用如下命令 arm-none-linux-gnueabi-gcc -v会出现下面的告警/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc: line 15:/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc:cannotexecutebinaryfile:Execformaterro...
2020-05-23 00:19:14 2216 2
原创 嵌入式linux单板上开启telnet功能
第一步,在文件系统中开启,开启这些命令。当然一般是开启的(busybox-1.28.4)Networking Utilities ---> ...... [*] telnet (8.7 kb) ...
2019-06-15 18:27:18 3127 1
原创 从零开始之驱动开发、linux驱动(七十一、电容触摸屏驱动)
一、电容式触摸屏检测原理基本原理是利用充电时间检测电容大小,从而通过检测出电容值的变化来获知触摸信号。电容屏的最上层是玻璃(不会像电阻屏那样形变),核心层部分也是由ITO材料构成的,这些导电材料在屏幕里构成了人眼看不见的静电网,静电网由多行X轴电极和多列Y轴电极构成,两个电极之间会形成电容。触摸屏工作时,X轴电极发出AC交流信号,而交流信号能穿过电容,即通过Y轴能感应出该信号,当交流电穿越时电...
2019-05-08 22:58:28 7582 6
原创 从零开始之应用发开、linux应用(三、应用调试之打印错误)
使用gdb调试,可以发现一些我们理解错误的逻辑问题,一般情况下我都是使用gdb进行调试的。但有时我们的应用程序很大,我们不知道哪里出的问题,即gdb调试不知道在哪里打断点(当然也可以单步或者自己定几个断点),这个时候就需要有别的方法来找到出错的大概位置。假设我们在程序中,对为初始化的指针赋值。或者对已经释放的内存进行了使用,很容易导致段错误。这里我以一个简单的例子为例来说明。...
2019-05-06 21:19:40 1581
原创 从零开始之应用发开、linux应用(二、应用调试之gdb)
Linux中包含一个很强大的调试工具GDB(GNU Debuger),可以用它来调试C和C++程序。什么是GDB?GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。问题:既然windows下有对用户友好的图形界面的调试工具了。那么为什么我们还需要回到命令行的模式呢?如果我们是在UNIX平台...
2019-05-05 22:01:54 1967
原创 从零开始之应用发开、linux应用(一、应用调试之strace)
strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序。 在Linux系统中,用户程序运行在一个沙箱(sandbox)里,用户进程不能直接访问计算机硬件设备。当进程需要访问硬件设备(如读取磁盘文件或接收网络数据等)时,必须由用户态模式切换至内核态模式,通过系统调用访问...
2019-05-02 22:15:26 2070
原创 从零开始之驱动开发、linux驱动(七十、4.19内核nfs挂载只读问题的延伸)
之前移植的3.16.57版本的内核,使用2018年7月的busybox自己构建的这个根文件系统。使用3.16.57版本的内核用nfs挂载,这个根文件系统是一个可读可写的内核。但后面为了学习设备树,移植了4.19版本的内核,发现文件系统成了只读的文件系统。开始是怀疑我pc上了nfs服务器那里设置的有问题,后面用3.16.57版本内核验证了发现是ok的。那么只能怀疑4....
2019-05-02 21:32:35 1155
原创 从零开始之驱动发开、linux驱动(六十九、内核调试篇--内核卡死分析)
内核卡死有很多种可能,驱动程序因为逻辑问题,出现死循环 共享资源出现死锁 系统跑飞等一般情况下,系统跑飞内核会打印Oops信息。有了Oops信息,我们就可以通过上一节的方法来推断出出错位置。而死锁或者驱动程序死循环并不会打印Oops信息。这个时候需要我们自己打印出来,出错位置的寄存器( r0 ~ r15等)信息来反推出出错位置。因为这个时候卡住的位置基本已经是...
2019-05-01 19:43:50 1508
原创 从零开始之驱动发开、linux驱动(六十八、内核调试篇--Oops解析)
什么是Oops?从语言学的角度说,Oops应该是一个拟声词。当出了点小事故,或者做了比较尴尬的事之后,你可以说"Oops",翻译成中国话就叫做“哎呦”。“哎呦,对不起,对不起,我真不是故意打碎您的杯子的”。看,Oops就是这个意思。在Linux内核开发中的Oops是什么呢?其实,它和上面的解释也没什么本质的差别,只不过说话的主角变成了Linux。当某些比较致命的问题出现时,我们的Linux...
2019-05-01 15:42:15 1639
原创 从零开始之驱动发开、linux驱动(六十七、内核调试篇--printk使用)
printk的使用我们在内核,驱动调试的时候使用的非常多比如前面在调试usb驱动的时候#include <linux/init.h>#include <linux/usb/input.h>#include <linux/hid.h>static int usb_simple_probe(struct usb_interface *intf,...
2019-05-01 12:25:16 2675
原创 从零开始之驱动发开、linux驱动(六十六、内核调试篇--printk原理)
上一节我们已经看到了console的注册,prink的基础就是console,所以本节我们主要看内核中prink的实现。/** * printk - print a kernel message * @fmt: format string * * This is printk(). It can be called from any context. We want it t...
2019-04-30 21:59:20 3496 1
原创 从零开始之驱动发开、linux驱动(六十五、内核调试篇--串口驱动)
上一节我们分析了bootoader中传过来的cmdline中的命令是如何解析并执行的。同时也是对bootloader中传过来的console进行了记录。console也就是我们所说的控制台,可以是任何常见的输出设备,比如serial,比如framebuffer,比如网口。本节主要以最常见的串口为例说明。如果有搜索过内核代码,可以看到绝大多数的console都是串口设备。所...
2019-04-24 00:25:57 1544
原创 从零开始之驱动发开、linux驱动(六十四、内核调试篇--基础知识2[console的建立])
上一节我们分析的earlay的printk知识,本节主要分析一下在内核启动后的printk的知识。主要是通过下面函数实现的after_dashes = parse_args("Booting kernel", static_command_line, __start___param, __stop___param - __start___param, ...
2019-04-21 23:50:38 866
原创 从零开始之驱动发开、linux驱动(六十三、内核调试篇--基础知识1[earlyprintk建立过程])
我们知道,内核中使用__section设置了很多的段属性,使用段属性可以很方便的对函数调用时间分层。比如我们之前常见的subsys_initcall,就要比module_init更早的执行,因为subsys_initcall在驱动中通常是bus和class,驱动程序调用执行需要class和bus已经创建才能执行驱动函数。关于这点我之前的博文已经有过分析。https://blog....
2019-04-21 18:09:44 836
原创 linux设备模型十四(hotplug和mdev使用)
mdev有两个主要的用途:初始化常用设备和动态更新。这两个用途都要需要内核的sysfs的支持并且需要把sysfs挂载到/sys。对于动态更新来说,你也需要开启内核的热插拔功能。以下是几个典型的代码段,从初始化脚本摘录:[0] mount -t proc proc /proc[1] mount -t sysfs sysfs /sys[2] echo /sbin/mdev &...
2019-04-20 14:15:05 1818
原创 linux设备模型十三(mdev原理)
udev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,两者的实现机理不同。udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作,包括创建/删除设备节点,加载/卸载驱动模块等等。mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_...
2019-04-18 23:02:56 2749
原创 linux设备模型十二(热拔插hotplug)
我们知道,一个最简单的字符设备驱动应该是下面这个形式。#include <linux/fs.h> #include <linux/init.h> /* 定义一个open函数 */static int first_drv_open(struct inode *inodep, struct file *filep){ return 0;}...
2019-04-15 00:24:58 2997
原创 从零开始之驱动发开、linux驱动(六十二、PL330 DMA控制器驱动)
pl330 dma驱动比较复杂,最近没时间研究这个的细节。这个稳定暂留,后面补上。
2019-04-14 20:07:51 984
原创 从零开始之驱动发开、linux驱动(六十一、PL330 DMA控制器)
一、DMA介绍首先简单介绍下什么是DMAC(Direct Memory Access Controller),DMAC 是一个自适应先进的微控制器总线体系的控制器,它由ARM公司设计并基于PrimeCell技术标准,DMAC提供了一个AXI接口用来执行DMA传输,以及两个APB接口用来控制这个操作,DMAC在安全模式技术下用一个APB接口执行TrustZone技术,其他操作则在非安全模式下执行...
2019-04-14 00:02:01 1925
原创 从零开始之驱动发开、linux驱动(六十、ARM AMBA总线介绍)
AMBA片上总线AMBA总线:AMBA总线是ARM研发的(Advanced Microcontroller Bus Architecture)提供的一种特殊的机制,可以将RISC处理器集成在其他IP芯核和外设中,它是有效连接IP核的“数字胶”,并且是ARM复用策略的重要组件。它不是芯片与外设之间的接口,而是ARM内核与芯片上其他元件进行通信的接口。2.0版本AMBA标准定义了三组总线:...
2019-04-12 23:09:39 1640
原创 从零开始之驱动发开、linux驱动(五十九、linux4.19的IIC驱动的编写和使用3)
本节不需要编写驱动,直接可以使用i2c-dev中编写号的驱动,来进行使用。也就是说这是一个完全的应用程序。程序在后面的代码仓库。这里说一下原理。正常情况下,每一个adaptor,都会在i2c_dev_init函数调用时创建一个设备在/dev/i2c-x这要求一个前提,adaptor必须在,i2c_dev_init执行之前先执行。内核的策略就是adaptor使用...
2019-04-08 22:11:51 882
原创 从零开始之驱动发开、linux驱动(五十八、linux4.19的IIC驱动的编写和使用2)
下面说的这种方式其实和前面的很相似1.在设备树文件中,设备所在的i2c总线下面定义好设备&i2c0 { status = "okay"; eeprom@50 { compatible = "atmel,24c02"; reg = <0x50>; }; };驱动只需要增加一个of_ma...
2019-04-08 19:48:49 789
原创 从零开始之驱动发开、linux驱动(五十七、linux4.19的IIC驱动的编写和使用1)
第一点,配置内核支持i2cDevice Drivers ---> I2C support ---> <*> I2C device interface [*] Autoselect pertinent helper modules I2C Hardware Bus s...
2019-04-06 00:35:01 1181
原创 从零开始之驱动发开、linux驱动(五十六、linux4.19的IIC驱动adaptor的注册)
上一节我们看到下面这函数了。/** * i2c_add_adapter - declare i2c adapter, use dynamic bus number * @adapter: the adapter to add * Context: can sleep * * This routine is used to declare an I2C adapter whe...
2019-04-02 00:06:15 960
原创 设备树学习(二十三、aliases节点分析)
在设备树中有一个叫做aliases的节点:/ { #address-cells = <1>; #size-cells = <1>; aliases { csis0 = &csis0; fimc0 = &fimc0; fimc1 = &fimc1; fimc2 = &fimc2; i2c0 = &i...
2019-04-01 23:00:02 7154
原创 从零开始之驱动发开、linux驱动(五十五、linux4.19的IIC驱动adaptor)
前面用了8节内容已经分析了2.6.35.7内核的iic驱动,可以发现,在linux中iic驱动还是稍微有些复杂的。在linux4.19内核中,其实百分之85~90还是和2.6内核的一样的。关于4.19的i2c,我大概会用两三节来进行分析,主要还是对硬件这个设备树引入后的变化分析。唯一不同的在于,linux内核引入设备树后,驱动层和硬件相关的内容都是通过设备树文件来指定。...
2019-04-01 00:06:09 1254 1
原创 从零开始之驱动发开、linux驱动(五十四、linux2.6下的IIC总结[8])
2.6.35.7内核的iic设备已经分析完毕了。我们这里做一下总结。首先linux下注册iic设备的方式是有五种的。这里我们对每一种的注册和顺序进行简单总结。这里我们的参考资料如下Documentation/i2c/instantiating-devices第一种方式:在mach-xxxx.c文件里面指定号设备名称,地址。static struct i2c...
2019-03-31 18:47:08 597
原创 从零开始之驱动发开、linux驱动(五十三、linux下的IIC设备驱动cdev[7])
i2c-dev.c文件完全可以被看作是一个I2C设备驱动, 不过, 它实现的i2c_client是虚拟、 临时的, 主要是为了便于从用户空间操作I2C外设。 i2c-dev.c针对每个I2C适配器生成一个主设备号为89的设备文件, 实现了i2c_driver的成员函数以及文件操作接口, 因此i2c-dev.c的主体是“i2c_driver成员函数+字符设备驱动”。#define I2C_...
2019-03-31 15:07:25 535
原创 从零开始之驱动发开、linux驱动(五十二、linux下的IIC设备驱动[6])
I2C设备驱动要使用i2c_driver和i2c_client数据结构并填充i2c_driver中的成员函数。 i2c_client一般被包含在设备的私有信息结构体中, 而i2c_driver则适合被定义为全局变量并初始化。这种驱动通常是相对稳定的驱动程序,通常不需要改动。下面给出内核中已被初始化的i2c_driver。static struct i2c_driver ...
2019-03-31 14:22:00 669
原创 从零开始之驱动发开、linux驱动(五十一、linux下的IIC总线的通讯方法[5])
我们需要为特定的I2C适配器实现通信方法, 主要是实现i2c_algorithm的functionality() 函数和master_xfer() 函数。functionality() 函数非常简单, 用于返回algorithm所支持的通信协议。linux中定义了一下方法/* To determine what functionality is present */#define...
2019-03-31 13:07:41 709
原创 从零开始之驱动发开、linux驱动(五十、linux下的IIC适配器的注册[4])
由于I2C总线控制器通常是在内存(寄存器)上的, 所以它本身也连接在platform总线上, 要通过platform_driver和platform_device的匹配来执行。 因此尽管I2C适配器给别人提供了总线, 它自己也被认为是接在platform总线上的一个客户。 Linux的总线、 设备和驱动模型实际上是一个树形结构, 每个节点虽然可能成为别人的总线控制器, 但是自己也被认为是从上一级总...
2019-03-31 00:18:19 662
原创 从零开始之驱动发开、linux驱动(四十九、linux下的IIC核心层的接口[3])
I2C核心中的主要函数如下:(1) 增加/删除i2c_adapterint i2c_add_adapter(struct i2c_adapter *adap);void i2c_del_adapter(struct i2c_adapter *adap);增加一个adadptor/** * i2c_add_adapter - declare i2c adapter, use...
2019-03-30 21:22:46 837
原创 从零开始之驱动发开、linux驱动(四十八、linux下的IIC核心层的建立[2])
I2C核心(drivers/i2c/i2c-core.c) 中提供了一组不依赖于硬件平台的接口函数, 这个文件一般不需要被工程师修改, 但是理解其中的主要函数非常关键, 因为I2C总线驱动和设备驱动之间以I2C核心作为纽带。首先看一下i2c核心层的创建函数。static int __init i2c_init(void);static void __exit i2c_exit(v...
2019-03-30 12:40:05 784
原创 从零开始之驱动发开、linux驱动(四十七、linux下的IIC框架【1】)
I2C总线仅仅使用SCL、 SDA这两根信号线就实现了设备之间的数据交互, 极大地简化了对硬件资源和PCB板布线空间的占用。 因此, I2C总线非常广泛地应用在EEPROM、 实时钟、 小型LCD等设备与CPU的接口中。如果在裸机情况下直接操作I2C,其实很简单,只要正确把握IIC的操作时序就可以了。https://blog.csdn.net/qq_16777851/article/d...
2019-03-30 11:31:19 1179
原创 从零开始之驱动发开、linux驱动(四十六、IIC协议原理)
IIC协议是一个板级异步双向的串行协议。只使用一根数据一根时钟两根线,通常频率都不会很高,通常我们使用在几百Khz,目前最高的器件能达到Mhz级别。IIC协议的缺点:数据线只有一根既要主机传输又要从机传输,所以传输速度很慢。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。主器件同时也负责终止一次传输。主器件的每一次启动传...
2019-03-28 23:39:03 928
原创 从零开始之驱动发开、linux驱动(四十五、DM9000网卡驱动)
这里我们肯定不是要从零开始编写网卡驱动的。因为编写网卡驱动时,需要网络基础知识,特别是网络底层的知识,目前还没学。将来我可能选择在,网络,图像视屏,或USB这个三个方向,选择一个深入钻研。这里主要对一个真实的网卡的框架进行分析,底层和物理寄存器或网络协议相关的就略过。4.19版本的内核,平台设备这边,都是用的设备树。之前开的那个设备树专栏的学习已经有了效果,下...
2019-03-27 23:41:10 1631
原创 Git使用学习(二十二、团队协作冲突的解决)
但凡是团队合作,就一定会出现冲突。假设项目经理张小龙在它的本地改了一个bug之后,推送到了远程库。这时项目组的小张肯定不知道项目经理的推送,更不知道项目经理张小龙改了那个位置的内容。此时假设小张也修改了这个位置,此时也向远程库推送自己的修改。此时因为出现冲突,小张推送会失败。此时小张必须先把远程库的拉取到本地,完成合并后在进行推送。我们在下面演示一下上面的情况。...
2019-03-26 22:52:58 809
原创 Git使用学习(二十一、远程库github操作[4]拉取)
上一节中,项目组员,小张已经把自己的本地库的内容推送到了远程库github。本节项目负责人张小龙,准备把远程库的内容拉取到他的本地。然后检查无误后把远程库合并到他的本地开发中。可以看到,拉取之前文件里面的内容是wechat 0.1 version当然,拉取(fetch)或(pull)都从远程来读文件,所以这里是不需要登录操作的。当然我们这里拉取的文件其实并不会...
2019-03-26 22:18:18 636
原创 Git使用学习(二十、远程库github操作[3]邀请加入团队和push)
上一节我们学习到,项目组成员,因为没有被邀请加入团队,所以不能向远程库推送自己的本地更改。这里开始我们就让项目的负责人,邀请项目组成员加入这个项目。下面给出操作步骤输入邀请人的github账号邀请创建后,可以看到,已经有了协作人的信息接下来要把邀请链接发生给,要求加入的人。当然,这个链接可以使用任何方式,Q...
2019-03-26 21:32:59 1129
原创 Git使用学习(十九、远程库github操作[2]clone)
上一节中项目经理张小龙先生已经把自己搞的WeChat 0.1版本放到了远程仓库了。接下来WeChat项目组的成员,小张需要把远程库的0.1版本的WeChat clone到他的本地。然后进行增加功能。这里我们换一个方式。使用Windows下的git来实现,成员小张的所有操作。小张先从远程仓库中拿到这个项目的clone地址。然后执行克隆操作git clone r...
2019-03-26 00:25:13 389
USB_HID的两篇官方文档
2019-01-10
51单片机移植的ucosii嵌入式操作系统
2018-07-22
基于51单片机移植的ucosii的代码
2018-07-22
基于51单片机写的一个多任务切换的简易OS
2018-07-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人