
tiny4412
文章平均质量分 83
年纪青青
嵌入式软件工程师:单片机编程,电路设计,Linux,Qt,opecv计算机视觉
展开
-
关于tiny4412开发板SD卡烧写u-boot脚本sd_fusing.sh的解释
对于嵌入式linux开发而言拿到tiny4412开发板第一件事就是将定制好linux内核跟板子实现很好的挂接CPU跟MCU(单片机)不同,单片机内部集成了RAM、ROM,在大多数情况下单个芯片就可以完成程序的存储以及运行。但是CPU,一般内部不集成或者只集成很小的RAM ROM空间,只提供芯片进行最基本的开机配置或者进行程序引导来使用。CPU生来为运行大型任务或者操作系统而原创 2017-09-20 15:51:11 · 4337 阅读 · 2 评论 -
linux内核定时器
linux内核定时器概述linux内核定时器是用来在未来某个时间点(基于jiffiles),执行某个函数的一种机制,相关源码在linux/timer.c文件中 linux内核定时器的超时函数运行一次后就不在运行了(相当于单次定时效果),但可以通过在超时函数中重新注册定时器来循环定时效果、在SMP(多核CPU)芯片的CPU上,定时函数总是在注册它的同一CPU上运行。linux内核定时器核心结构体内核原创 2017-12-06 20:35:14 · 1052 阅读 · 0 评论 -
基于tiny4412开发板的I2C子系统写法
I2C总线知识I2C子系统框架 I2C是一个不是很复杂的通信协议,在裸机上能够轻易实现,但是linux系统下的I2C系统框架复杂的,简单控制IO电平输出不行,这是因为与裸机相比,linux是一个多进程系统,在进行I2C通信过程中很可能被其他进程打断,这样就会造成数据丢失,为了避免此种情况,便有了现在的I2C子系统,除了保证数据不丢失,可移植性也大大增强。I2C核心I2C核心提供了I2C总线驱动和设原创 2017-12-16 17:40:06 · 773 阅读 · 0 评论 -
LCD设备驱动框架分析(数据结构)
LCD设备驱动框架图如上图所示核心层是通用的,不需要任何修改。驱动开发者只需要实现硬件设备驱动层帧缓冲设备可以看做是一个完整的子系统,主要由核心层的fbmem.c和硬件设备驱动层构成核心层代码fnmem.c向上提供了完整的字符设备操作接口,也就是实现注册字符设备,提供通用的open,read,write,ioctl,mmap等接口;向下给硬件设备驱动层提供标准的驱动编程接口;在linux系统原创 2017-12-16 17:43:19 · 1078 阅读 · 0 评论 -
linux内核tasklet机制
前言 前面讲了linux中断编程:顶半部、底半部 中断顶半部:做紧急的,耗时短的事情,同时还启动中断底半部(如果有)。 中断底半部:做耗时的事情,这个事件可以被中断 实现方法:tasklet、工作队列、软中断等机制。实际上是把耗时的事件推后执行,不在中断程序中执行。内核tasklet机制tasklet机制是一种比较特殊的软中断,tasklet一词原意是“小片任务”的意思,这里原创 2017-12-07 20:07:13 · 1126 阅读 · 0 评论 -
linux下C语言基本的目录操作编程函数简介
目录简介对于linux文件目录操作函数其实使用命令就能实现,但是其实对于一些命令本质上就是调用系统函数的,比如:madir,umask,chown等命令。获取文件信息主要函数#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>//不能读取软连接文件int st...原创 2018-04-22 11:00:56 · 3307 阅读 · 1 评论 -
linux进程相关函数(获取、销毁、切换···)
进程概述进程:就是进行中的程序 程序:存放指令的程序文件,存放在磁盘上,固定不变的,保存着指令的有序集合。 程序执行过程:将程序从硬盘导入到内存,内存上分为代码区、静态变量区、堆栈区等等 文本区:储存处理器执行的代码 数据区:存储变量和动态分配的内存:全局变量,局部变量,静态变量, 堆栈区:存储着活动进程调用的指令和本地变量,指针变量->栈区,动态分配的内存->堆区 进...原创 2018-05-04 08:23:42 · 3888 阅读 · 0 评论 -
基于JZ2440自己编写4.3寸LCD驱动
简介 linux内核自带LCD驱动,这里我们自己从头写一个LCD驱动程序,编写APP的人只知道使用open、read、write······,并不清楚原理图或者寄存器,这接口函数最终调用的是我们自己在驱动中实现的驱动层open、read、write,这些代码与硬件息息相关。一般写驱动基本步骤就是: 定义主设备号 写一个文件操作集合 register_chidev进行...原创 2018-08-26 09:48:24 · 883 阅读 · 0 评论 -
基于JZ2440编写触摸屏驱动
简介 JZ2440开发板配套的是一款4.3英寸电阻触控屏,电阻触控屏原理很简单,就是尖锐物体在某一个点按下,上面触控薄膜导电,由于这个点举例起始点暂且规定00点,距离不同,电阻薄膜导电电阻不同,电压压降也就不同,原理就是通过判断XY两个方向轴与零点之间的电压差确定触控位置。内核触控驱动 内核自带触摸屏驱动,在s3c2440_ts.c这个文件,实现这个文件的主体框架就是...原创 2018-08-26 16:36:06 · 1024 阅读 · 0 评论 -
Linux输入子系统框架
输入子系统自己写的驱动程序,自己可以调用,我们自己写驱动的流程一般是,建立fops结构,使用register_chrdev在初始化函数中进行注册,在应用中使用open函数打开该设备。这种驱动不标准只能在公司内部,别人知道驱动用法的情况下才能使用,当我们使用QT等标准程序时,这类标准程序不能打开像我们这样的野驱动,我们应该让我们的驱动程序融入“标准”中去,linux提供的输入子系统输...原创 2018-08-23 08:11:54 · 332 阅读 · 0 评论 -
基于JZ2440按键输入子系统代码实现
简介 自己写驱动流程 APP:open、read、write 驱动层: 实现相应的open、read、write函数 使用file_operation结构挂接自己的相关函数 使用chrdev_register注册 初始化 退出等等 现在有了子系统结构,核心层已经有人写好,我们只需要实现两层即可:设备层、操作层 设备层实现步骤...原创 2018-08-23 08:13:40 · 393 阅读 · 0 评论 -
JZ2440开发板之LED支持lseek
驱动#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/device.h>#include <linux/delay.h>#include ...原创 2018-08-23 08:15:20 · 208 阅读 · 0 评论 -
基于JZ2440实现驱动互斥操作以及阻塞非阻塞操作
实现同一驱动不能被同时打开思路很简单,设置一个变量,打开时减一,如果另外程序再将其打开,数值变化,就并不能打开。下面看伪代码static int canopen=1;int xxx_open(){ if(--canopen!=0) { return -1; }else { 正常打开; }}void xx...原创 2018-08-23 08:18:21 · 162 阅读 · 0 评论 -
基于JZ2440实现linux驱动异步通信
按键驱动前期按键驱动无论是查询、中断、poll都是采用应用程序主动查询的方式,能不能有一种按键按下,驱动告诉应用程序该查询的机制呢?那是肯定的,类似于系统编程的信号机制。这里需要解决核心问题: 信号发出者 信号接收者 信号怎么发建立一个异步通信结构体该结构体存储相关信息static struct fasync_struct *button_fasync;建立系...原创 2018-08-23 08:19:45 · 239 阅读 · 0 评论 -
linux基于socket网络编程
socket简介 Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的...原创 2018-08-23 08:35:25 · 7401 阅读 · 0 评论 -
基于JZ2440的LED平台驱动写法
驱动分层分离 在前面介绍的输入子系统中,核心层input.c,设备层button.c包含硬件相关代码,软件层cdev.c纯软件处理部分。 linux驱动中有很多类似的驱动形式,例如总线驱动platform平台设备模型 platform.c属于核心层级别,设备层device包含硬件相关代码,driver层包含驱动层相关代码属于比较固化稳定的软件代码,设备发生改变只要改变设备层代码...原创 2018-08-23 22:53:23 · 324 阅读 · 0 评论 -
基于tiny4412按键中断驱动的poll、select函数演示
poll函数应用背景文件阻塞、非阻塞操作对单个文件可能影响不大,但当我们以阻塞的方式打开多个文件时,有时会出现一种不好的现象,下面利用伪代码演示一下:#include <···>int fd1,fd2;int main(void){ fd1=open("/dev/sd1",ORDWR); fd2=open("/dev/sd2",ORDWR); read(fd1,user,4) //读取原创 2017-11-24 11:35:47 · 393 阅读 · 0 评论 -
Framebuffer设备应用程序编程
Framebuffer的原理Framebuffer是linux系统抽象出来供用户态进程直接写屏的一种设备,用户可以将Framebuffer看做是显示内存的一个映像,将其映射到地址空间之后,就可以直接进行读写操作,而写操作可以立即同步显示在LCD屏幕上。这种操作是抽象的,统一的,应用编程者不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。 简单说:把一个原创 2017-12-11 21:57:27 · 979 阅读 · 0 评论 -
linux早期经典字符设备驱动模型
早期经典标准字符设备描述方式没有使用一个结构体进行封装,没有做一个整体描述。设备号主设备号:0~255(10除外) 次设备号:0~255全部占用(早期经典字符设备只能以主设备号区分)设备特征安装后不会在/dev目录下创建设备文件节点,需要手动mknod命令创建调用一个register_chrdev注册函数后,一个主设备号下面的256个次设备号都被占用完了,也就是说一个主设备号只能使用regis原创 2017-10-20 08:48:41 · 558 阅读 · 0 评论 -
简单的linux杂项设备驱动的写法
linux将设备驱动分成几大类:字符设备、杂项设备、块设备、网络设备······本篇文章介绍杂项设备驱动的编写,杂项设备与字符设备本质上没什么区别,但是写法上有区别。除此之外杂项设备主设备号都为10,设备间通过次设备号来进行区分,与字符设备相比节约了主设备号。杂项设备驱动编写模式一般如下:在linux系统下一切皆文件,设备驱动同样秉承此“”大法“”。对文件操作就少不了打开、读写原创 2017-10-11 13:38:07 · 1761 阅读 · 0 评论 -
手把手移植tiny4412开发板uboot
uboot的作用类似电脑BIOS,是芯片上电之后启动的一个引导程序(裸机),引导操作系统(linux)的启动原创 2017-10-12 13:14:56 · 1629 阅读 · 0 评论 -
linux2.6标准字符设备驱动模型(手动注册)
linux2.6标准字符设备核心结构//虽然linux26有核心结构体,但在代码中没有具体操作,他们的调用在相关注册函数中对其有操作struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list;原创 2017-10-25 13:35:18 · 832 阅读 · 0 评论 -
书写驱动必要安全性检测
驱动安全性意义驱动直接操作的对象是硬件,运行在内核空间,如果驱动不可靠一旦出现问题,操作系统会出现异常,有很大几率造成系统崩溃。因此驱动安全性极为重要,在驱动代码中凡是有可能执行失败的函数,都需要对其返回值进行判断,成功后才可以进入下一个环节。最大限度减少出错的可能。示例代码(没有安全检测)#include<linux/kernel.h>#include<linux/module.h>#incl原创 2017-10-26 08:39:08 · 315 阅读 · 0 评论 -
tiny4412开发板LED灯驱动写法
简介led灯成本很低,操控简单,在嵌入式产品中不可或缺,可以作为调试标识,状态指示等等,高级用法还可以作为呼吸灯进一步增强其美观性。本章介绍只控制led灯的亮灭,tiny4412开发板有四个LED灯在核心板上供用户操作,led灯亮灭靠cpu IO口输出电平,具体操控看实际电路。电路图在tiny4412开发板上,led灯电路如下: 与CPU连接如下: 可以看到CPU相应引脚输出相关电平,就原创 2017-11-12 15:08:13 · 3381 阅读 · 0 评论 -
基于tiny4412开发板LED灯驱动标准的read write函数写法
简介原来曾经写过一个led灯的驱动,调用read write函数对灯的亮灭进行操作,虽然达到了控制的目的,学过系统编程的人知道,其实标准的read write函数的用法,并不是这样的,在对文件操作时,我们读取相关文件内容时,每当我们读取一部分内容时,文件内位置指针会随着移动,在进行文件内容读取时,读取内容会在当前位置读取一定数量的内容。写操作同样。当我们写一些内容到一个文件,例如将123445678原创 2017-11-12 15:44:24 · 698 阅读 · 0 评论 -
基于tiny4412开发板led灯字符设备ioctl驱动写法
ioctl接口作用write:向设备写入数据,单独这个接口并不能满足现实设备控制的全部需求。例如一个LCD控制器:主要作用是驱动lcd屏,要显示就是通过write接口把显示数据发给lcd控制器指定的显存。而参数设置类参数通过write接口设置就可能回和普通的显示数据弄混了。为了解决这个问题,内核提供一个接口ioctl对设备进行控制(参数设置,参数查询等功能)。ioctl主要实现不太好实现的功能。io原创 2017-11-13 14:42:19 · 1263 阅读 · 0 评论 -
tiny4412开发板蜂鸣器驱动
简介蜂鸣器作为简单的发声器件在电路中是个常用的元器件,它的控制比较简单,搭配简单的驱动电路,通过CPU I/O引脚的电平变化就可以控制它的发声与否。在高级控制中可以利用PWM波对蜂鸣器进行调音,这里只演示蜂鸣器是否发声,在tiny4412开发板上蜂鸣器驱动电路如下: 与蜂鸣器连接的引脚通过逐级查找,可以看到它的引脚与CPU GPD0引脚连接,分析蜂鸣器驱动电路可以得出这样的结论:CPU I/O原创 2017-11-04 13:11:14 · 2397 阅读 · 1 评论 -
基于tiny4412按键中断编程
准备工作要先把内核中原有的按键驱动干掉,重新编译内核,用新的内核进行编程。否则原来的按键驱动会阻碍我们编写自己的按键中断驱动,比如相关资源无法使用被系统的按键驱动占用,导致我们无法使用。具体操作方法方法如下: 将*号改为M或者空白 执行完毕之后,重新编译内核,在linux-3.5目录执行make -j4至于j几根据机器性能来决定,机器性能越好,数字可以填的越大,可增大编译速度。make执原创 2017-11-18 20:47:40 · 1118 阅读 · 0 评论 -
基于tiny4412开发板LED灯驱动标准的llseek函数写法
简介我们写的驱动,有时候虽然也调用相关read write等函数,但是我们在上层操作时,可能我们写的并不符合标准API函数接口,因此我们需要将我们的驱动函数进行标准化处理。lseek用户空间驱动原型off_t lseek(int fd, off_t offset, int whence);参数: fd:文件描述符 offset:偏移量,可证可负 whence:偏移位置,有几个重要的宏如下:原创 2017-11-12 17:34:46 · 377 阅读 · 0 评论 -
linux内核工作队列
内核工作队列概述工作队列(workqueue)是另外一种将工作推后执行的形式,工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行,最重要的就是工作队列允许被重新调度甚至睡眠。linux workqueue工作原理linux系统启动期间会创建名为kworker/u:x(x是0开始的整数,表示CPU编号)工作者内核线程,该线程创建之后处于sleep状态。从调度器原创 2017-12-09 12:45:42 · 5725 阅读 · 1 评论 -
linux中断编程、中断基础介绍
中断基础介绍中断就是CPU正常运行期间,由于内、外部事件引起的CPU暂时停止正在运行的程序,去执行该内部事件或外部事件的引起的服务中去,服务执行完毕后再返回断点处继续执行的情形。中断的意义极大提高CPU运行效率中断服务程序中断处理程序:在中断发生时被调用的函数称为中断服务函数。 中断服务函数的原则:linux是多进程操作系统 中断不属于任何一个进程,因此不能在中断程序中休眠和调用schedul原创 2017-11-16 19:47:23 · 9603 阅读 · 1 评论 -
linux平台设备驱动模型
linux平台设备介绍linux2.6以上的设备驱动模型中,有三大实体:总线,设备和驱动。总线负责将设备和驱动绑定,在系统没注册一个设备的时候,会寻找与之匹配的驱动:相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配则由总线完成。 一个现实的linux设备和驱动通常都需要挂接在一个总线上例如PCI、USB、I2C、SPI接口的设备都是由对应的总线来管理,通过总线来操作设备。但对于So原创 2017-12-10 21:01:40 · 1612 阅读 · 0 评论 -
移植QT5.7到tiny4412开发板
移植前的准备 虚拟机:ubuntu16.04,硬盘空间尽量大一些,20G略微有点小,开发板根文件系统已经做好。 交叉编译环境:arm-linux-gcc使用4.8版本以上,否则对c++11支持度不好,这里使用arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 QT5.7源码包:针对嵌入式平台编译,编译...原创 2018-08-28 08:44:42 · 4384 阅读 · 4 评论