
嵌入式
文章平均质量分 81
卡咖喱
擅长各种开发环境的搭建和部署
展开
-
busybox移植到ARM开发板
1. 什么是busybox(1)busybox是一个C语言写出来的项目,里面包含了很多.c文件和.h文件。 (2)busybox这个程序开发出来就是为了在嵌入式环境下构建根文件系统(以下简称rootfs)使用的,也就是说他就是专门开发的init进程应用程序。 (3)busybox为当前系统提供了一整套的shell命令程序集。譬如vi、cd、mkdir、ls等。在桌面版的linux发行版(譬原创 2017-07-16 15:09:15 · 5745 阅读 · 2 评论 -
主机挂载开发板的NFS文件系统
介绍手上有一块nanopi,想在上面测试写好的驱动,但是开发环境在主机上,为了方便测试,需要使用NFS服务器将开发板文件夹挂载到主机上,这个文件夹相当于一个共享文件夹,只需将写好的驱动复制到该文件夹中,在开发板中就可以看到复制进去的文件了。 注意:这里是在nanopi上搭建NFS服务器,而不是在主机中搭建,好处是任意一台主机(即使没有安装NFS服务器)都可以挂载nanopi的文件夹,坏处是如...原创 2018-07-05 11:53:36 · 674 阅读 · 0 评论 -
Linux驱动开发02:platform驱动框架的使用和分析
介绍platform驱动框架是利用总线(bus_type)+驱动(driver)+设备(device)模型建立的驱动框架。这个模型中总线只有一条,而驱动和设备可以有多个,驱动和设备全都挂接到总线上,总线完成驱动和设备的匹配工作,一旦驱动和设备相匹配,则会执行驱动中的probe函数将驱动注册到系统。同时驱动还可以调用设备中写好的资源(resource)来区别不同的设备,该驱动框架的好处是: ...原创 2018-07-12 15:12:45 · 2687 阅读 · 0 评论 -
Linux驱动开发06:【I2C驱动】写一个MPU6050驱动
介绍在上节中实现了不依赖于硬件的I2C总线驱动和设备驱动,这一节我们利用I2C框架来真正地驱动硬件,由于手上的I2C器件只有一个MPU6050,所以这里实现了一个MPU6050的I2C设备驱动程序,硬件平台是nanopi-air。注意因为nanopi已经实现了I2C总线驱动(具体实现在drivers/i2c/busses/i2c-mv64xxx.c),因此我们可以直接使用现成i2c_adapt...原创 2018-07-24 09:42:31 · 1812 阅读 · 0 评论 -
Linux驱动开发07:【设备树】分析nanopi设备树,添加I2C子节点
介绍本节简单介绍一下设备树,然后对nanopi的设备树文件进行分析。为了真正地体会设备树的用法,我们在现有设备树的I2C节点中尝试添加一个mpu6050的子节点,然后在nanopi的文件系统中尝试访问该节点,以验证是否添加成功。下一节会修改mpu6050的I2C驱动,使之支持该节点。设备树简介设备树文件是一种板级描述文件,该文件由一系列的节点和子节点组成,用于描述CPU内部资源和板...原创 2018-07-25 09:58:18 · 4318 阅读 · 2 评论 -
Linux驱动开发09:【设备树】nanopi的LED驱动
介绍这节通过在nanopi的设备树中添加LED子节点,来实现一个LED驱动。由于linux内核支持LED驱动框架并且有通用的LED驱动,因此这里只需按照驱动要求添加设备树节点就可以了,不用我们自己重写LED驱动。这一节先在设备树中添加一个LED节点,重新编译设备树测试效果,然后对内核中drivers/leds/leds-gpio.c进行分析,看该LED驱动是如何实现的。添加设备树节点...原创 2018-08-18 10:22:48 · 2505 阅读 · 0 评论 -
Linux驱动开发08:【设备树】MPU6050驱动和i2c驱动
介绍上一节在nanopi设备树的I2C节点下增加了一个MPU6050的子节点,并在sysfs中查看到了该节点已经被正确解析,这一节我们来修改之前的MPU6050驱动,使之能够匹配到我们的设备树节点,然后再分析设备树节点是如何加载到i2c总线上的。MPU6050驱动的变更在之前的MPU6050驱动中,为了方便测试,我们是在模块的init函数中临时注册了一个i2c_client到i2c...原创 2018-08-17 09:00:30 · 3198 阅读 · 0 评论 -
Linux驱动开发10:【设备树】nanopi的按键驱动
介绍这一节在nanopi上实现按键驱动,和LED驱动一样,通用的按键驱动在linux内核中已经实现好,我们只需要按照要求写好设备树即可,不用我们自己实现按键驱动。这一节中首先修改设备树并测试按键驱动,然后分析drivers/input/keyboard/gpio_keys.c文件,看按键驱动是如何实现的。添加设备树节点在sun8i-h3-neo-nanopi-air.dtsi文件中...原创 2018-08-20 10:53:04 · 1943 阅读 · 0 评论 -
Linux驱动开发11:【设备树】nanopi的PWM驱动
介绍前两节利用设备树实现了nanopi的LED驱动和按键驱动,这一节来实现nonapi的PWM驱动。PWM驱动在内核中也有相应的实现,因此这里只是按照要求添加设备树文件即可。这一节和之前一样,首先修改设备树文件进行测试,然后分析内核相应的软件实现。添加设备树节点因为在sunxi-h3-h5.dtsi和sun8i-h3-nanopi.dtsi文件中已经定义了PWM节点// s...原创 2018-08-21 15:03:23 · 3931 阅读 · 3 评论 -
uboot和linux kernel中创建defconfig文件
1. 介绍最近在移植uboot的时候我想根据当前的.config文件创建自己的defconfig文件到configs/目录中,开始以为是直接拷贝.config文件然后重命名即可,然后想了想uboot的Makefile文件中应该是有这个功能的,但是百度时没有人提到,最后翻墙用google终于发现确实有这个功能,于是在这里记录一下。2. 使用make命令创建defconfig文件总结一下现在的情...原创 2018-11-16 10:09:38 · 3349 阅读 · 0 评论 -
将sd卡格式化为ext4格式并挂载
1. 介绍uboot加载内核时会从sd中读取内核镜像,和老版本的uboot不同,新版本的uboot支持文件系统,直接将内核镜像复制到sd卡中,然后uboot启动时就会访问sd卡的文件系统,找到内核镜像文件并加载。uboot支持什么文件系统是是由环境变量loaduimage决定的,这里我的环境变量为:loaduimage=ext4load mmc ${mmcdev}:${mmcbootpart}...原创 2018-11-19 14:50:56 · 8867 阅读 · 1 评论 -
ARM+Linux嵌入式开发00:【介绍】硬件、uboot、Linux内核和根文件系统
概述从学嵌入式以来,还没有真正意义上的进行过uboot或Linux内核的移植,于是为了满足自己的好奇心和探索精神,打算将最新的uboot和Linux内核移植到开发板上,最近移植也接近了尾声,因此打算开一个深坑:写一篇较为完整的uboot+linux+rootfs移植的文章,如果有幸有人能读到,也是一种参考。平台介绍开发板九鼎x210(s5pv210)bootloader...原创 2018-11-30 21:39:46 · 1202 阅读 · 0 评论 -
ARM+Linux嵌入式开发02:【uboot-2017移植】s5pv210载入BL1
概述原创 2018-12-08 11:33:06 · 834 阅读 · 0 评论 -
ARM+Linux嵌入式开发03:【uboot-2017移植】uboot启动第一阶段
概述上一章讲到210.bin是u-boot.bin的前16KB程序,也就是BL1,根据s5pv210的启动流程,这段程序的作用是初始化DRAM,然后将BL2载入DRAM当中,最后跳转到DRAM运行。要分析这段程序,就要了解uboot的启动过程以及源码构成。从上电到进入_main函数之前uboot启动总的来说可以分为两个大的阶段,第一个是从上电到进入_main()之前,这部分代码是在对芯片运行...原创 2018-12-09 11:37:33 · 1455 阅读 · 0 评论 -
ARM+Linux嵌入式开发01:【uboot-2017移植】s5pv210启动流程
概述在开始代码讲解之前,先看s5pv210的启动流程,因为uboot的初始化代码就是建立在芯片启动流程基础上的。三星系列芯片针对的都是手机、平板电脑等运行操作系统的设备,使用的是ARM-Cortex A系列架构,而不同于如STM32等单片机使用ARM-Cortex M系列架构,其中A系列针对是应用级处理器,M针对的是微控制器,下面引用一段博客的介绍1:ARMv7开始以Cortex来命名,并分...原创 2018-12-07 13:57:16 · 1368 阅读 · 0 评论 -
ARM+Linux嵌入式开发04:【uboot-2017移植】底层硬件初始化
概述上一节讲了uboot启动的第一阶段,其中会调用一个lowlevel_init函数对进行底层硬件初始化,然后完成重定位,这一节开始对底层硬件初始化作介绍,主要包括:LED灯,电源锁存,时钟,串口。LED灯打开board/samsung/x210/lowlevel_init.S文件,查看lowlevel_init()函数,首先是检查是否需要重定位:ldr r0, =0x0000ffff ...原创 2018-12-15 12:31:27 · 1522 阅读 · 1 评论 -
ARM+Linux嵌入式开发05:【uboot-2017移植】重定位
概述上一节初始化好了串口和LED,我们可以用它们进行调试;也设置好了时钟和DRAM,为uboot的重定位做好准备。之前所做的所有工作都是在BL1中,也就是uboot的前16KB,而大部分uboot的代码还在SD卡中没有载入内存,没有载入内存的原因是之前我们使用的是内部SRAM,容量不足以放下整个uboot,而现在已经初始化好了外部DRAM,拥有了512MB内存,是完完全全够放下整个uboot,所...原创 2018-12-30 12:08:31 · 1354 阅读 · 0 评论 -
树莓派、51、arduino和树莓派几种常用芯片及开源硬件的比较
血统IDE语言价格硬件资源下载方式开发难度51KEILC3~10PWM/AD/SPI/UART串口简单stm32KEIL/IARC12PWM/AD/DMA/I2C/SPI/UART/CAN/USB串口/编程器较难arduinoarduino ide类C12PWM/AD/I2C/SPI/UART串口最简单树莓派li...原创 2019-02-13 21:16:15 · 9948 阅读 · 0 评论 -
Linux驱动开发05:【I2C驱动】I2C总线驱动和设备驱动
介绍这里实现一种不涉及硬件的I2C总线和设备驱动,然后分析I2C驱动在系统中的注册过程。这里实现的驱动类似于之前的FIFO字符设备驱动,与之不同的是这里使用了I2C驱动框架,设备文件写入和读取将通过i2c_client传递到指定的i2c_adaper,然后在i2c_adapter中操作一段内存。这个驱动非常简单,甚至没有使用FIFO这种硬件结构,只能进行读和写,毕竟内存的操作不是中断,重点是熟...原创 2018-07-17 18:06:59 · 4743 阅读 · 0 评论 -
Linux-0.11内核分析08:进程间通信
1. 管道机制管道文件的创建过程//创建管道实例#include <stdio.h>#include <unistd.h>int main(){ int n, fd[2]; pid_t pid; int i, j; char str1[1024]; char str2[512]; for(i=0; ...原创 2018-07-11 15:10:49 · 642 阅读 · 0 评论 -
busybox menuconfig配置
Busybox Settings---> Build Options---> [*]Build BusyBox as a static binary(no shared libs)Busybox Library Tuning---> [*]vi-style line editing commands [*]Fancy shell promptsLinux原创 2017-07-16 15:45:21 · 4269 阅读 · 0 评论 -
设备树传参中的platform device的匹配
在高版本的Linux内核中使用了设备树进行传参,之前购买一块nanopi的板子使用的是linux 4.11.2版本的内核(使用的友善之臂的Mainline linux)就是这种情况,并且使用设备树传参过后,原来硬编码在mach-xxx.c文件中的platform device全部都放入了设备树中,而原来使用name进行platform device和driver进行匹配的方式也发生了变化。 以原创 2017-09-16 18:13:41 · 2094 阅读 · 0 评论 -
PX4开发(2):QGroundControl的使用及电调校准——准备起飞
1. 介绍上一节把固件烧写好了,接下来进行传感器的校准了,传感器校准要使用官方的地面站,也就是QGC(QGroundControl,官网下载点击这里)。安装好QGC后打开,然后将pixhawk使用USB线连接到电脑,QGC上就可以显示当前板子的状态。 我这里是校准好了的,所以有一个绿色的小点,没有校准应该是红色的,接下来进行传感器校准,校准可以参考这个视频。 因为我们已经烧写好固件原创 2018-02-01 14:04:46 · 22810 阅读 · 13 评论 -
PX4开发(1):ubuntu下pixhawk开发环境搭建
1. 介绍之前买了个330的四轴,最近想利用起来,所以买了个pixhawk来玩。pixhawk是开源的,所以想看看能不能在其基础上开发出什么。 要做开发首先要配置环境,由于官方推荐在linux环境下开发,所以这里介绍ubuntu下pixhawk的开发环境配置。 首先,网上能够找到很多ubuntu下配置环境的博客,但是因为年代比较久远了,其中有很多坑的,我都一一踩过了,下面直接给出我测试可行...原创 2018-01-09 19:57:08 · 16089 阅读 · 22 评论 -
快速配置vim+ctags+cscope
基本使用v:进入visual模式,使用上下左右对文本进行框选 v+d:visual模式下按d,剪切文本,并回到normal模式 v+y:visual模式下按y,复制文本,并回到normal模式 p:粘贴 yy:复制一行ctagsCtrl+]:跳转到函数定义 Ctrl+t:返回cscope~/.vimrc 设置如下:if has("cscope&amp原创 2018-06-02 11:59:36 · 815 阅读 · 0 评论 -
Linux驱动开发01:字符设备、互斥锁、等待队列、定时器和异步通知
介绍这里是linux驱动最基础部分,我会用一个不使用任何驱动框架、不包含任何硬件操作的程序来实现一个字符设备驱动,其中会包含互斥锁、等待队列、定时和异步通知的使用,最后分析它们在内核中到底是如何运作的。代码和验证这是一个用内存模拟的字符设备驱动,在初始化时会分配一页的内存给fifo_dev.mem_entry,在写入函数中,向这段内存的添加内容,在读取函数中从这段内存头部读取内容,然后...原创 2018-06-29 12:37:20 · 1498 阅读 · 0 评论 -
Linux驱动开发03:Input子系统
介绍本章以”BTN_0”事件为例, 使用input子系统向内核注册一个”BTN_0”的输入事件,然后通过定时器定时触发来模拟按键按下的操作;在应用层中通过注册输入事件来接收驱动发出的事件。整个过程不涉及硬件,只是介绍Input子系统的框架。 Input子系统基于cdev提供接口,属于字符设备,所有使用input子系统构建的设备都使用主设备号13,同时输入子系统也支持自动创建设备文件,这些文件...原创 2018-07-16 17:05:52 · 613 阅读 · 0 评论 -
Linux驱动开发04:块设备驱动和网络设备驱动
介绍因为块设备驱动和网络设备驱动实际中用得较少,所以只给出驱动模板,因为我也没有具体测试,溜了溜了。块设备驱动模板struct xxx_dev { int size; struct request_queue *queue; /* The device request queue */ struct gendisk *gd; ...原创 2018-07-16 17:22:08 · 916 阅读 · 0 评论 -
Linux-0.11内核分析01:从开机加电到执行main函数之前的过程
1. 启动BIOS,准备实模式下的中断向量表和中断服务程序(ISR)按下电源键,处理器(IA-32)进入16位实模式,从CS:IP=0xFFFF0处开始运行。BIOS程序在主板的一块ROM芯片中,该芯片无需初始化即可直接读取,被接在处理器的0xFE000-0xFFFFF地址处。BIOS程序的入口地址被设计为0xFFFF0,因此上电过后处理器实际上运行的是BIOS程序。BIOS程序将中断...原创 2018-07-11 14:48:19 · 591 阅读 · 0 评论 -
Linux-0.11内核分析02:设备环境初始化及激活进程0
设备环境初始化及激活进程01. 设置根设备、硬盘/*init/main.c --------------------------------------------------------------- */#define DRIVE_INFO (*(struct drive_info *)0x90080)#define ORIG_ROOT_DEV (*(unsigned s...原创 2018-07-11 14:53:20 · 610 阅读 · 0 评论 -
Linux-0.11内核分析03:进程1的创建及执行
进程1的创建及执行1. 函数调用关系 --- init --- main.c --- sched_init() | |- hd_init() | |- fork() --- int 0x80 | |- init() --- setup() --- int 0x80...原创 2018-07-11 14:58:44 · 943 阅读 · 0 评论 -
Linux-0.11内核分析04:进程2的创建及执行
--- init --- main.c --- sched_init() | |- init() --- setup() --- int 0x80 | |- open("/dev/tty0") --- int 0x80 | |- dup(0)...原创 2018-07-11 15:01:04 · 595 阅读 · 0 评论 -
Linux-0.11内核分析05:文件操作
文件操作1. 安装文件系统// 示例mount /dev/hd1 /mnt// 对应操作--- fs --- super.c --- sys_mount() --- dev_i=namei("/dev/hd1")//获得hd1的inode | |- dev = dev_i->i_zone[0]//获取h...原创 2018-07-11 15:02:45 · 722 阅读 · 0 评论 -
Linux-0.11内核分析06:用户进程与内存管理
用户进程与内存管理1. 示例// str1.c#include <stdio.h>int foo(int n){ char text[2048]; if(n==0) return 0; else{ int i=0; for(i; i<2048; i++) text...原创 2018-07-11 15:06:05 · 758 阅读 · 0 评论 -
Linux-0.11内核分析07:缓冲区与多进程操作文件
1. 缓冲块的进程等待队列A为一个读盘进程,目的是将hello.txt中的100字节读入buffer[100]中B为一个读盘进程,目的是将hello.txt中的200字节读入buffer[200]中C为一个写盘进程,目的是将hello.txt写入字符串”ABCDE”三个进程执行顺序为A–>B–>C,进程间没有父子关系// 进程A打开文件--- fs --- op...原创 2018-07-11 15:08:00 · 440 阅读 · 0 评论 -
git的基本使用、分支创建和冲突解决
介绍记录在Ubuntu下使用git命令更新代码到github的过程在github上创建版本库在github上注册账号获取本机的ssh密钥 $ ssh-keygen -C 'xxx' -t rsa 其中xxx处为你的电子邮箱,可以和github的注册邮箱不一致。此命令会在~/.ssh文件夹下建立保存秘钥。如果~/.ssh已经有文件,则不用执行这一步。将ssh秘钥添加到g...原创 2018-03-08 11:17:55 · 537 阅读 · 0 评论