第一期&第二期:
一期(免费): 54节视频 共16.93G
二期√ :73节视频,每节50分钟总时长3650分钟,共29.6G
◆掌握写汇编代码的能力,可以分析任意裸板包括U-boot、内核里的相关汇编代码;
◆掌握常用的硬件部件的操作,比如GPIO,UART,I2C,LCD,触摸屏;
◆可以写出这些硬件部件的裸板程序;深入理解
ARM体系统架构,可以写出具备中断功能的裸板程序。
对程序现场的保存、恢复有所了解,这些原理适用于任何架CPU适用于内核及应用程序。
◆熟悉裸板程序的结构,给你一个Bootloader就能分析它的初始化部分、内存使用情况、链接地址、重定位、程序的相对跳转/绝对跳转等;
◆掌握Bootloader启动内核的原理,能完全自己写出一个Bootloader。
◆掌握三大类驱动程序的框架:①字符设备驱动②块设备驱动③网卡驱动
◆掌握驱动程序中各种操作:休眠-唤醒、 同步互斥和异步通知,定时器,
上下半部等能自己写出2期视频讲的各种驱动,它们已经涉及工作中的绝大部分驱动
◆学习驱动的套路:分配-设置-注册,掌握驱动的分析方法
◆掌握裸板调试方法:点灯、打印、JTAG工具进行源码级别的调试;查看反汇编。
◆掌握驱动调试方法:打印,自制打印;分析oops信息,栈回溯,理解内核原理并修改内核;自制调试工具
◆掌握系统级别的应用调试方法:使用工具,修改内核自制工作。
◆自己写一个bootloader, 它可以让你快速了解u-boot的核心功能。
◆移植一个全新的u-boot, linux。
◆编译busybox重新构造根文件系统。
◆移植2期驱动到3.4.2内核,你会在发现不同的内核下写驱动方法一样。
下面的课表中的3、4、5属于第1期和第2期的内容。
学本课程前,应该自行掌握第一、二部分的知识:LINUX基本操作和C基础
第一部分 基础知识之Linux基本操作 |
备注 |
1. 在虚拟机上安装一个ubuntu |
也可直接用虚拟机打开光盘的ubuntu |
2. 熟悉各种操作命令:ls,cd,pwd,ifconfig,tar,… |
命令很简单,刚接触不熟练就记到本子上,用到时查看 |
3. 了解Linux下文件的属性,掌握chown、chmod命令 |
往后的学习中经常碰到权限问题 |
4. 掌握文件编辑命令:vi |
简单使用就可以了,vi太强大,你只需要掌握简单用法 |
4. 掌握文件查找命令:find, grep |
Linux下这2个命令功能强大,远超windows下的查找功能 |
5. 掌握在Linux下安装交叉编译工具链的方法,设置PATH环境变量 |
你们经常碰到command not found |
6. 掌握在Linux上安装、启动这些服务:NFS,FTP,SSH |
必备,能装能用就行 |
7. 会写简单的shell脚本 |
知道所谓脚本就是把命令写在一个文件里,就暂时够了 |
建议:随便找一本Linux的操作书来看就可以,来来去去就那些命令,重新回到DOS时代吧,就是命令行,别指望像windows那样方便 |
|
第二部分 基础知识之C语言基础 |
C语言能力越强,对后面的学习越有利,这里列出基本要求 |
1. 指针是C语言的精华 |
练习:指针、指针的指针、指针数组、用指针来传参数 |
2. 结构体的定义、使用 |
|
3. 使用基本的open,read,write函数来操作文件 |
|
4. 头文件的使用,编译时怎么指定头文件的位置、怎么找到头文件 |
|
5. 链接程序时怎么指定库文件的位置,怎么引用库文件 |
|
6. 宏开关的使用 |
|
7. 使用gcc等命令行来编译程序,预编译、链接的概念 |
|
8. 编写简单的Makefile |
Linux独有,暂时能写一个简单的就行 |
建议:C语言的练习可以在VC下做,找一本好的C语言书。一定要写代码,别只是看,写写写写写写!!!!找一些题目来上机实验,C语言的好书似乎不少。 |
|
第三部分 基础知识之看懂原理图 |
一定要看英文版的数据手册,别指望找什么中文手册 |
目标:随便给你一个板子,能根据原理图、芯片手册就明白应该怎么去操作某个外设 |
|
1. GPIO类管脚的使用:配置为输出或输入,设置它的输出电平、读输入状态 |
|
2. 掌握几种协议类接口:I2C、UART、LCD等的信号原理、操作方式 |
|
3. 掌握内存类接口:怎么确定地址、怎么设置时序 |
需结合主芯片的手册和原理图确定 |
建议:若有单片机的基础、有电子专业的基础,这部分应该不成问题。若没有,可以看看我录制的"学前班第1课:怎么看原理图"视频。 我没有见过教人怎么看原理图的书,我个人只看过:微机原理、数字电路,然后就是做过电路设置的工作,从中煅炼出来的。 |
|
第四部分 ARM体系结构与裸机实验 |
韦东山Linux视频第1期(免费) |
|
|
第01课 环境搭建及工具、概念介绍 |
第1部分的细化,以后就在Linux上工作了,环境必须先建好 |
第02课 GPIO实验 |
写出第1个裸板程序,掌握几条汇编指令,汇编怎么调用C |
知道怎么操作GPIO,了解2440的启动过程 |
写出第1个Makefile, |
第03课 存储管理器实验 |
掌握SDRAM的初始化方法 |
掌握位置无关指令,相对跳转、绝对跳转 |
掌握代码重定位 |
第04课 MMU实验 |
大概了解ARM里虚拟地址、物理地址的概念 |
了解内存映射的基理 |
掌握链接脚本的写法 |
感觉有难度的就跨过 |
第05课 NAND FLASH控制器 |
掌握第1个协议类接口:NAND的操作原理 |
掌握把NAND中的程序重定位的方法 |
第06课 中断控制器 |
掌握ARM架构的中断处理过程 |
第07课 系统时钟和UART实验 |
掌握提高系统时钟的方法,掌握串口的操作 |
第08课 LCD实验 |
掌握LCD的操作方法,掌握时序设置(建议同时看第2期LCD驱动) |
再次深入了解链接脚本,为何要清BSS段 |
第09课 U-BOOT分析 |
结合<嵌入式Linux应用开发完全手册>了解u-boot的运行流程 |
理解u-boot的“命令”实现方法,能自己添加一个命令 |
了解u-boot怎么传参数给内核,怎样启动内核 |
第10课 内核启动流程分析 |
掌握Linux内核的启动流程:u-boot传入的机器ID的处理 |
u-boot传入的其他参数的处理 |
内核怎么去启动第1个应用程序 |
第11课 构建根文件系统 |
第1个进程的作用 |
根文件系统的构成 |
制作文件系统映象文件、烧写 |
第12课节 字符设备驱动程序 |
简单的字符设备驱动:框架、查询方式、中断方式、poll、 |
异步通知、同步互斥等基本概念 |
|
第五部分 高级驱动程序及调试
|
韦东山Linux视频第2期 |
|
第13课 输入子系统 |
第12课里的驱动代码基本上都是自己写的, |
第13课分析内核自带的驱动,理解后再添加自己的硬件支持 |
输入子系统是很重要的,触摸屏、键盘、鼠标等都是这套框架 |
第14课 驱动程序分层分离概念_总线驱动设备模型 |
内核里大量使用所谓的平台驱动、平台设备,这只是一个技巧 |
第15课 LCD驱动程序 |
掌握frame buffer这套自带驱动 |
掌握LCD的操作原理、时序设置 |
掌握编写硬件相关的LCD底层驱动 |
第16课 触摸屏驱动程序 |
掌握电阻式触摸屏的操作原理 |
掌握输入子系统的第2个驱动(第1个驱动是第13课) |
第17课 USB驱动程序 |
掌握USB驱动程序的框架:USB主机控制器驱动、USB设备驱动 |
掌握USB设备驱动的编写方法 |
掌握USB数据的读写方法 |
第18课 块设备驱动程序 |
了解块设备驱动程序的框架,为何引入块设备驱动 |
掌握第1个最简单的块设备驱动程序:用内存模拟硬盘 |
第19课 NAND FLASH驱动程序 |
MTD设备的分层 |
NAND FLASH的操作原理 |
NAND FLASH的时序设置 |
NAND FALSH底层硬件驱动的设计 |
划分分区 |
第20课 NOR FLASH驱动程序 |
MTD设备的分层 |
NOR FLASH的操作原理 |
NOR FLASH的时序设置 |
NOR FALSH底层硬件驱动的设计 |
划分分区 |
第21课 网卡驱动程序 |
了解第3类驱动:网卡驱动的框架 |
编写一个虚拟网卡驱动来加深了解 |
第22课 网卡驱动程序 |
内存类接口芯片的操作方法:确定基址、设置时序 |
移植:编译、出错、解决错误、再编译 |
第23课 I2C设备裸板程序 |
掌握I2C协议,掌握在S3C2440上怎么操作I2C |
第24课 I2C驱动程序 |
掌握I2C设备驱动程序的框架及编写方法 |
第25课 字符设备驱动程序概念纠正之另一种写法 |
egister_chrdev之外的第2中写法:cdev |
第26课 OSS模型声卡驱动的框架及UDA1341、WM9876驱动移植 |
|
第27课 DMA |
在内核下怎么使用DMA |
第28课 热拨插机制(hotplug)和mdev的使用 |
结合内核代码了解设备节点的自动创建及删除 |
掌握mdev的使用方法 |
实现热拨插动作,比如让U盘自动挂载 |
第29课 裸板调试 |
点灯、打印、用JTAG工具进行源码级(gdb,eclipse)的调试 |
进行源码级(gdb,eclipse)调试的前提条件 |
第30课 驱动程序调试 |
printk打印,借用proc文件系统、分析oops信息、栈信息回溯 |
自制工具──寄存器编辑器 |
第31课 从系统的角度进行应用程序调试 |
用strace命令跟踪系统调用 |
用gdb和gdbserver调试 |
自制系统调用 |
编写输入模拟器 |
第32课 新内核下的I2C驱动程序 |
新内核下的I2C驱动程序框架 |
编写I2C设备驱动程序 |
不写驱动程序,从用户态直接访问 |
编写I2C总线驱动程序 |
毕业班第1课 自己写bootloader |
这是第3部分裸板的集成:启动代码、重定位、NAND操作、 |
传参数给内核、启动内核 |
从这个简单的程序,你可以理解u-boot的最重要功能 |
毕业班第2课 移植最新u-boot |
这也是第3部分裸板的实际应用 |
毕业班第3课 移植3.4.2内核,构造根文件系统 |
|
毕业班第4课 移植驱动到3.4.2内核 |
有人说2.6.22.6内核太老了,你看了这一课就会发现 |
使用老内核可以让你学到更多,并且把驱动移到新内核很简单 |
|
第三期:
项目一: 数码相框
衍生项目:电子书,文件浏览器
知识点:字符编码,矢量字体显示,编写通用Makefile,多线程 编程,网络编程,远程调试,自制GUI
目标:
◆掌握面向对象的模块化编程思想,搭建易扩展的程序框架
◆操作LCD,触摸屏,初次学习如何实现整个项目
◆有些产品需要更小巧的界面,耗费资源比较大的QT等就不适合,本项目可以直接应用于这类产品,已有学员在公司产品上用起来了
项目二:视频监控
衍生项目:数码相机,用无线路由器实现远程监控,远程串口,物联网(开关灯)
知识点:驱动,摄像头V4L2, WIFI网卡, 3G上网卡, ALSA声卡;应用, 在LCD上显示摄像头图像(数码相机)
目标:
◆编写服务器程序传输视频,声音等数据
◆编写客户端程序在手机上显示视频等
◆掌握几大复杂驱动开发, 实现比较复杂的项目以提高应用编程水平
项目三:电源管理
◆修改Bootloader,内核,应用以实现系统的休眠、唤醒
◆学习内核里电源管理框架掌握驱动的电源管理功能
◆结合应用程序实现整个系统的省电
课程章节及要点 |
实战项目 |
韦东山Linux视频第3期 |
第1个项目数码相框 |
|
第1课第1节_数码相框之系统框架 |
总体讲述这个项目所涉及的框架,所需要的知识 |
第1课第2.1节_数码相框_字符的编码方式 |
怎样在LCD上显示文字, 从最简单的点限显示讲起, 到复杂的矢量字体显示─这在实际应用中大量用到,这一课对LCD的操作也更加深入 |
第1课第2.2节_数码相框_字符的点阵显示 |
第1课第2.3.1节_数码相框_freetype理论介绍 |
第1课第2.3.2节_数码相框_在PC上测试freetype |
第1课第2.3.3节_数码相框_在LCD上显示一个矢量字体 |
第1课第2.3.4节_数码相框_在LCD上显示多行文字 |
第1课第3.1节_数码相框_额外项目_电子书之效果及框架 |
额外项目1,实现了在LCD上显示阅读文本 知识点:文件编码方式, UNICODE, 首次尝试以面向对像的方法编写应用程序 |
第1课第3.2节_数码相框_额外项目_电子书之代码阅读及编写 |
第1课第3.3节_数码相框_额外项目_电子书之指针的操作 |
第1课第3.4节_数码相框_额外项目_电子书之链表的操作 |
第1课第3.5节_数码相框_额外项目_电子书之在PC上显示 |
以面向对像的方法编写的程序很容易扩展, 这是一个示例 |
第1课第4节_数码相框_编写通用的Makefile |
从零写出一个复杂的Makefile,工作中可以把它用于所有项目 |
第1课第5.1节_数码相框_使用多种方法支持多输入_框架及轮询方式 |
以多种方式实现了输入事件的读取 |
第1课第5.2节_数码相框_使用多种方法支持多输入_select方式 |
第1课第5.3节_数码相框_使用多种方法支持多输入_多线程 |
第1课第6.1节_一小时学会网络编程_两个简单例子_tcp_udp |
掌握网络编程,掌握远程打印(实际产品一般没有串口供你操作) |
第1课第6.2节_修改电子书源码支持远程打印1 |
第1课第6.2节_修改电子书源码支持远程打印2 |
第1课第7节_libjpeg的使用 |
使用开源库显示JPG图片 |
第1课第8.1节_数码相框功能及程序框架 |
这一节实现了数码相框的架构设计,以MainPage为例讲解了具体页面的程序设计,把MainPage理解后, 其他页面的操作是相似的 |
第1课第8.2节_数码相框程序编写_先写框架 |
第1课第8.3.1节_数码相框程序编写_图标显示之bmp数据提取 |
第1课第8.3.2节_数码相框程序编写_图标显示之缩放 |
第1课第8.3.3节_数码相框程序编写_图标显示之测试 |
第1课第8.4.1节_数码相框程序GUI编写_MainPage显存管理 |
第1课第8.4.2节_数码相框程序GUI编写_MainPage页面规划 |
第1课第8.4.3节_数码相框程序GUI编写_MainPage输入功能 |
第1课第8.4.4节_数码相框GUI程序编写_MainPage测试 |
第1课第8.5.1节_数码相框效果演示及编译使用方法 |
串讲了其他页面的代码, 改进了其中一个页面, 它实际上就是一个文件浏览器 |
第1课第8.5.2节_数码相框完整代码的讲解 |
第1课第8.5.3节_数码相框改进性能_支持中文 |
第1课第8.5.4节_数码相框课后作业及思路 |
第2个项目视频监控 |
第2课第1.1.1节_摄像头驱动_V4L2框架分析 |
虚拟驱动程序忽略了复杂的硬件操作, 通过它可以快速理解V4L2视频驱动 |
第2课第1.1.2节_摄像头驱动_虚拟驱动vivi的测试 |
第2课第1.1.3节_摄像头驱动_虚拟驱动vivi彻底分析 |
第2课第1.1.4节_摄像头驱动_从零写一个虚拟驱动 |
第2课第1.1.5节_摄像头驱动_USB摄像头驱动框架分析 |
工作中我们不一定要自己写摄像头驱动,但是要会修改,会修改的前提是能看得懂,看得懂的好方法是: 从零写一个 |
第2课第1.1.6节_摄像头驱动_从零写USB摄像头驱动之分析描述符 |
第2课第1.1.7节_摄像头驱动_从零写USB摄像头驱动之实现数据传输1_框架 |
第2课第1.1.7节_摄像头驱动_从零写USB摄像头驱动之实现数据传输2_简单函数 |
第2课第1.1.7节_摄像头驱动_从零写USB摄像头驱动之实现数据传输3_设置参数 |
第2课第1.1.7节_摄像头驱动_从零写USB摄像头驱动之实现数据传输4_URB |
第2课第1.1.7节_摄像头驱动_从零写USB摄像头驱动之实现数据传输5_调试 |
第2课第1.1.8节_摄像头驱动_从零写USB摄像头驱动之设置属性 |
第2课第1.1.9节_自制USB摄像头硬件的驱动编写_修改UVC |
我们开发了一款USB、CMOS接口二合一的摄像头: 用两种方法实现它的驱动程序 |
第2课第1.1_10节_自制USB摄像头硬件的驱动编写_修改MYUVC |
第2课第1.1_11节_在LCD上显示摄像头图像1_效果_框架_准备工作 |
衍生项目: 加上保存图片功能的话, 这就是一个数码相机. 这个程序支持YUV,MJPEG,RGB格式的摄像头, 可以在LCD或PC上显示摄像头图像 |
第2课第1.1_11节_在LCD上显示摄像头图像2_实现摄像头模块 |
第2课第1.1_11节_在LCD上显示摄像头图像3_实现转换模块 |
第2课第1.1_11节_在LCD上显示摄像头图像4_整合代码 |
第2课第1.1_11节_在LCD上显示摄像头图像5_调试测试 |
第2课第1.1_11节_在LCD上显示摄像头图像6_在PC上显示 |
第2课第1.1_12节_CMOS摄像头之硬件原理 |
根据V4L2的规范,从零实现了CMOS摄像头驱动程序 并写一个测试程序把图像在LCD上显示出来 |
第2课第1.1_13节_从零写CMOS摄像头驱动1_画框架 |
第2课第1.1_13节_从零写CMOS摄像头驱动2_编写驱动程序框架 |
第2课第1.1_13节_从零写CMOS摄像头驱动3_初始化摄像头模块 |
第2课第1.1_13节_从零写CMOS摄像头驱动4.1_逐个讲解并设置摄像头控制器的寄存器 |
第2课第1.1_13节_从零写CMOS摄像头驱动4.2_逐个讲解并设置摄像头控制器的寄存器 |
第2课第1.1_13节_从零写CMOS摄像头驱动4.3_逐个讲解并设置摄像头控制器的寄存器 |
第2课第1.1_13节_从零写CMOS摄像头驱动5_编译调试 |
第2课第1.1_14节_额外项目2_便携式无线监控1_效果演示 |
衍生项目:把USB摄像头接到无线路由器上,使用手册连接无线路由器,在手机上观看摄像头图像 |
第2课第1.1_14节_额外项目2_便携式无线监控2_实现过程(上) |
第2课第1.1_14节_额外项目2_便携式无线监控3_实现过程(下) |
第2课第1.1_15节_使用WIFI网卡1_准备工作及配置内核 |
介绍使用WIFI时的若干概念, 移植WIFI驱动程序, 编译开源工具使用WIFI网卡, 最后会写一个应用程序仿照手机实现设置、使用WIFI的功能 |
第2课第1.1_15节_使用WIFI网卡2_概念及工具iw(STA模式) |
第2课第1.1_15节_使用WIFI网卡3_工具wpa_supplicant(STA模式) |
第2课第1.1_15节_使用WIFI网卡4_工具dhcp及全自动使用wifi |
第7课第5节_使用WIFI网卡_AP模式
第7课第6节_使用WIFI网卡_仿手机写wifi操作程序
第8课第1节_3G上网卡_工具及使用
使用开源工具使用3G上网卡,并仿照开源工具编程使用它
第8课第2节_3G上网卡_编程自动切换模式
第8课第3节_3G上网卡_编程自动确认拨号端口
第9课第02节_ALSA声卡_裸板之编写程序_P
先写出声卡的裸板程序,这使得我们可以掌握声卡的硬件操作过程;
再分析ALSA驱动程序的框架及调用过程,然后从零写出一个ALSA声卡驱动,这使得我们可以彻底掌握ALSA驱动。
虽然工作中我们很可能只是移植厂家提供的驱动,但是前提是我们要对驱动框架有深入的理解,而最好的学习方法就是从零写出来。作为移植的示例,我们还移植了WM8976的声卡驱动。最后,简单地写了一个ALSA应用程序。
第9课第03节_ALSA声卡_裸板之编译和测试1
第9课第04节_ALSA声卡_ALSA驱动框架
第9课第05节_ALSA声卡_ASoC驱动框架
第9课第06节_ALSA声卡_体验声卡
第9课第07节_ALSA声卡_分析调用过程
第9课第08节_ALSA声卡_从零编写之框架
第9课第09节_ALSA声卡_从零编写之参数设置
第9课第10节_ALSA声卡_从零编写之数据传输
第9课第11节_ALSA声卡_从零编写之调试
第9课第12节_ALSA声卡_从零编写之添加音量控制
第9课第13节_ALSA声卡_从零编写之WM8976
第9课第14节_ALSA声卡_移植原厂WM8976驱动
第9课第15节_ALSA声卡_修改内核声卡BUG
第9课第16节_ALSA声卡_编写ALSA声卡应用程序
第10课第1节_讲解mjpg-streamer_移植_效果演示
我们使用开源工具mjpg-streamer来作为服务器端以传输视频,这本课程里,先分析它的源码;然后写一个PC客户端程序以接收视频并显示出来。
第10课第2节_讲解mjpg-streamer_框架
第10课第3节_讲解mjpg-streamer_源码分析(上)_主进程
第10课第4节_讲解mjpg-streamer_源码分析(中)_输入通道_视频采集过程
第10课第5节_讲解mjpg-streamer_源码分析(下)_输出通道_视频传输过程
第10课第6节_讲解mjpg-streamer_自己写客服端(上)
第10课第7节_讲解mjpg-streamer_自己写客服端(下)
第10课第8节_讲解mjpg-streamer_自己写客服端_编译调试
先介绍电源管理,再修改uboot支持电源管理命令,继而修改驱动添加电源管理,介绍runtime_PM框架,regulator,
最后编写支持开关机的应用程序
第1课第1节_电源管理概述
第2课第1节_在uboot实现电源管理_编写休眠功能
第2课第2节_在uboot实现电源管理_编写唤醒功能
第2课第3节_在uboot实现电源管理_调试
第3课第1节_系统睡眠模型_Linux的suspend流程
第3课第2节_系统睡眠模型_修改内核或驱动以使用suspend功能
第3课第3节_系统睡眠模型_给驱动程序添加电源管理功能
第4课第1节_runtime_PM框架第3课第3节_系统睡眠模型_给驱动程序添加电源管理功能
第4课第2节_runtime_PM修改驱动程序和使用
第5课第1节_regulator系统的概念并编写代码
第5课第2节_regulator系统之编译测试
第6课第1节_APP_修改数码相框以支持自动关闭LCD
第6课第2节_APP_编写支持开关机(suspend)的应用程序
第7课_从系统角度考虑电源管理,我们要学习更多
|
|
【嵌入式Linux系统人才学习路线及阶段目标】
嵌入式Linux可以分为两类:底层系统、应用开发
◆先把开发板当作单片机来用,这可以让你熟悉LINUX环境编程、熟悉ARM板的硬件操作就是写各种裸板程序
◆接着学习UBOOT,你可以认为UBOOT就是各种裸板程序的集合。如果觉得UBOOT太复杂,可以看毕业班视频里从零写Bootloader,你把它理解了就可以
◆接着移植LINUX,这稍做一下就可以了,不用深究,知道怎么配置、编译就可以
◆文件系统:这是要弄懂的,这让你对LINUX启动后的流程有所了解
◆驱动程序:这才是重点,看第2期视频吧。我都是由浅到深地讲,每个驱动从零现场写代码
◆最后是整个项目的经验,看第3期视频,从应用到驱动,实现了3个大项目及6个衍生项目