树莓派高阶开发课程
=========================================================
1. ubuntu18.04版本安装
让程序猿搭建环境太搞笑了,轻松easy!
linux ubuntu18-04中:
1、mkdir SYSTEM
unzip linux-rpi-4.14.y.zip
2、装交叉工具链(安装之前的方法)
-
树莓派等芯片带操作系统的启动过程
C51,STM32(裸机)》》》》》》C直接操控底层寄存器实现相关业务。 业务流程型的裸机代码 遥控灯: while(1) 垃圾桶:WemosD1 LOOP 恩智浦智能车: stm32 X86,Intel windows 启动过程: 电源 -》 BIOS -》windows内核-》C,D盘-》 程序启动(QQ) 嵌入式产品: 树莓派,mini2440, mini6410,nanopi,海思,RK(瑞芯微)------人脸识别打卡器,智能家居主控。。。 启动过程: 电源-》BootLoader(引导操作系统启动)-》Linux内核-》文件系统(根据功能性来组织文件夹,带访问权限)-》KTV点歌机, 安卓 启动过程: 电源-》 fastBoot/Bootloader/-》linux内核-》文件系统-》虚拟机-》HOME应用程序-》点某图标打开某APP BootLoader: 一阶段 让CPU 跟内存,FLASH, 串口,IIC,IIS, 数据段,打交道,驱动这些设备(汇编和C结合) 二阶段: 引导Linux内核启动 (纯C)
3. 树莓派Linux源码目录树分析
https://www.cnblogs.com/senior-engineer/p/4929703.html
大约1.3w个C文件 1100w行代码
Linux是开源,免费,LInux开源社区工作者共同维护,爱好
Linux是一个开源的,支持多架构多平台代码 =非常牛逼
可以执行非常高
但是Linux内核编译出来一般就几M. 4M
因为支持多平台,多架构,所以编译之前要配置,配置成适合的目标平台来用
ARM
海思 友善之臂 RK 树莓派 nanoPi
X86
PowerPC
MIPS
4. 树莓派Linux源码配置
https://blog.csdn.net/nicekwell/article/details/78482833
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev(ncurses的库)
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5(ncurses的库)
驱动代码的编写
驱动代码的编译需要一个提前编译好的内核
编译内核就必须配置
配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核
厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
find . -name *_defconfig(找树莓派.config)
第一种方式:
cp 厂家.config .config
第二种方式:
make menuconfig 一项项配置,通常是基于厂家的config来配置
第三种方式:
完全自己来
如何配置树莓派的Linux内核
驱动两种加载方式:
* 编译进内核 zImage包含了驱动
M 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载
内核配置:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
指定ARM架构 指定编译器 树莓派 主要核心指令
-
树莓派Linux内核编译
5.1 编译: ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 指定用多少电脑资源进行编译 zImage生成内核镜像 modules要生成驱动模块 dtbs生成配置文件 5.2 编译成功后,看到源码树目录多了vmlinux,失败则无此文件 ( yuanzixuan@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ ls) 成功后,目标zImage镜像arch/arm/boot底下 5.3 打包zImage成树莓派可用的xxx.img ./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img 注意: dmesg 用来看usb挂载的信息(此时需要把usb插到linux的ubuntu中) 5.4 数据拷贝 mkdir data1 data2 挂载U盘 sudo mount /dev/sdb1 data1 一个fat分区,是boot相关的内容,kernel的img sudo mount /dev/sdb2 data2 一个是ext4分区,也就是系统的根目录分区。 安装modules, 设备驱动文件: hdmi usb wifi io ...(少了这个一些wifi设备文件会不能用)yuanzixuan@ubuntu:~/SYSTEM/linux-rpi-4.14.y$必须在这个路径下 sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/chenlc/data2 modules_install (这里的data2就是ext4分区) 安装更新 kernel.img 文件,注意镜像名字是kernel7.img 先备份 cd /home/chenlc/data1 cp kernel7.img kernel7OLD.img 再把编译新生成的拷贝到data1,起名kernel7.img cp kernel_new.img /home/yuanzixuan/data1/kernel7.img(~/SYSTEM/linux-rpi-4.14.路径) md5sum kernel_new.img md5sum /home/yuanzixuan/data1/kernel7.img (比较这里的大小,应该是一样) 拷贝配置文件(是为了能够加载驱动) cp arch/arm/boot/dts/.*dtb* /home/chenlc/data1 cp arch/arm/boot/dts/overlays/.*dtb* /home/yuanzixuan/data1/overlays/ 现在可以把卡放在树莓派上去了 uname -r :用来查看当前的版本
6. 文件系统
1. 什么是文件系统?
常规认知: 根目录
文件系统是操作系统用于明确存储设备组织文件的方法。
以上说的方法:就是文件管理系统(程序),简称文件系统
2. 文件系统(文件管理系统的方法)的种类有哪些?
FAT VFAT NTFS EXT1/2/3/4 HFS ....
树莓派查看文件系统的命令: df -T
vfat : boot(bootloader, kernel)
ext4 : 根目录
tmpfs : 内存文件系统
3. 什么是分区?
windows: 随意(面向普通用户PC),目录即分区
C(装系统的位置)也可以随意在C盘存放文件. D盘(用户随意发挥)
Linux: 按照功能来分区,每个分区严格存放文件(开发者)
嵌入式系统可以分为4个区,分别是
bootloader、 启动代码
para、 启动代码向内核传递参数的位置
kernel、 内核分区
根分区等 文件系统结构
2. 什么是文件系统目录结构?
常规认知: 根目录,不是分区,和windows不同
2. 什么虚拟文件系统Virtual File System ?
vfs就是对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口,
3. 虚拟文件系统有什么作用?
简化应用程序员的开发
不管是什么文件类型,不管文件是磁盘还是设备,都只用open read write统一操作
7. Linux内核驱动基础框架
linux里面:
pin4driver2.c 的编译
cp /mnt/hgfs/dama/pin4driver2.c ~/SYSTEM/linux-rpi-4.14.y/drivers/char
修改makefile,告诉编译器,需要编译该驱动文件夹
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
scp drivers/char/pin4driver2.ko pi@192.168.0.105:/home/pi
yuanzixuan@ubuntu:中
pin4Test.c的编译 ( ~/SYSTEM/linux-rpi-4.14.y:这个路径下)
arm-linux-gnueabihf-gcc pin4Test.c -o pin4test
scp pin4test pi@192.168.0.105:/home/pi
树莓派里面:
sudo insmod pin4driver2.ko(加载驱动) 卸载驱动sudo rmmod pin4driver2 不需要写ko
ls /dev/pin4 -l(看效果)
lsmod (列出内核的驱动文件)
sudo chmod 666 /dev/pin4(修改权限)
dmesg |grep pin4(dmesg打印内核的printk)
./pin4test(用来验证一下)
cat /proc/cpuinfo(查看树莓派的型号)
8.地址
unix设计与实现
内核的设计文档
1、总线地址
2、物理地址
3、虚拟地址
BCM2835 树莓派3b cpu的型号 他是ARM-cotexA53架构
10.驱动两大利器 : 电路图:作用:通过电路图找到寄存器
和芯片手册
芯片手册第六章:
GPFSEL0 GPIO Function Select 0 功能选择 输出/输入(GPIO Function Select Register) 32位
14-12 001 = GPIO Pin4 an outpu
GPSET1 GPIO Pin Output Set 0
0 No effect
1 Set GPIO pin n
GPCLR0 GPIO Pin Output Clear 0 清0
0 = No effect
1 = Clear GPIO pin n
恢复ubuntu网络的图标
1、删除NetworkManager缓存文件
service NetworkManager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
service NetworkManager start
2、修改/etc/NetworkManager/NetworkManager.conf
managed=true
3、重启NetworkManager
sudo service network-manager restart
11摄像头:
(按照下面网址安装)在树莓派里
1、https://jingyan.baidu.com/article/47a29f2474a555c01523994c.html
{注意:在 mjpg-streamer/mjpg-streamer-experimental目录下,先git下面的
sudo apt-get update
sudo apt-get install subversion
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev
sudo apt-get install cmake
sudo apt-get install git
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make all
sudo make install
}
2、修改配置文件
cd /mjpg-streamer/mjpg-streamer-experimental 下
vi start.sh
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"(把uvc 换成 raspicam)
input_raspicam.so
sudo raspi-config(把摄像头打开)
选择interfacing Prtions
camera
在 cd mjpg-streamer/mjpg-streamer-experimental/
./start.sh
http://IP地址:8080
raspistill -o image.jpg 用来照相
12:http;
gg = G代码对齐
~就是我们的工作目录,就是/home/yuanzixuan
https://cnblogs.com/xietianjiao/p/13255099.html
1、下载curl-7.71.1.tar,gz 到ubuntu中 解压(tar xvf curl-7.71.1.tar,gz )
2、cd docs vi INSTALL.md(这个里面写了安装的方式)
3、(配置)
cd cd curl-7.71.1/
./configure --prefix=$PWD/_install (--host== 写交叉编译arm-linux..... )树莓派也需要这样写,因为树莓派里的gcc就是面向arm-linux 所以不需要写arm-linux...
make
make install
4、export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib/(配置环境变量)
gcc demo1.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl(连接库)前面的是链接头文件,后面的是库
注意:https://www.cnblogs.com/wainiwann/p/4210343.html(export LD_LIBRARY_PATH 的使用)
库文件默认是在/usr/lib底下的,但我们安装的实在curl-7.71.1/_install/lib/下,所以有链库
vi /tmp/get.html
翔云:
1、写相关的代码之后:~/httpHandler/curl-7.71.1$ rm _install/ -rf,删除此目录下的东西,配置ssl
~/httpHandler/curl-7.71.1$ rm _install/ -rf
2、cd docs vi INSTALL.md(配置方法在这下面)
3、./configure --prefix=$PWD/_install --with--ssl
4、wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz(安装openssl)
tar xvf openssl-1.1.0e.tar.gz
./config
make
sudo make install
./configure --prefix=$PWD/_install --with--ssl
make
make install
gcc demo2.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib -lcurl
5、bas 查看base64
base64 (图片)
注意:首先得base64 () 有个tmpFile:编程代码中有写