drivers_day01
来源:互联网 发布:音乐伴奏制作软件 编辑:程序博客网 时间:2024/06/05 09:59
三个要求:
1.安装linux系统
ubuntu,fedora(u盘安装,硬盘安装)
安装前备份重要的资料!
手动分区!
2.安装工具和搭建开发环境
tftp
nfs
vim + .vimrc + .vim(插件)(/home/tarena/下)
ctags / cscope :看源代码工具
wine + SI
openssh-server(远程登陆服务软件)
kermit/minicom
USB转串口:linux驱动无需安装(笔记本电脑没有串口,需要使用USB转串口线,先安装相应型号的USB转串口线驱动)
3.每天半小时笔试题,复习UC后续内容
********************************************************************************
嵌入式linux系统移植注意和开发内容:
明确:uboot,内核,根文件系统,代码都是官方提供的!
案例:某位同学上班,老板给一个TI,ARM开发板,需要一周时间把系统跑起来!
实施步骤:
1.查看是否有官方的操作文档
2.要明确开发板上的硬件信息,原理图,硬件说明书
CPU
内存(基地址,容量)
闪存(nandflash,norflash,emmc,容量)
串口
网络
USB
接口(I2C,SPI,GPIO,CAN,UART(232,485,422))
3.获取交叉编译器(推荐使用官方提供的!)
设置交叉编译器的环境变量!
添加4.4.6交叉编译器的环境变量:
1.vim /home/tarena/.bashrc
将文件最后一行注释掉!
保存退出!
2. sudo vim /etc/environment
在PATH中添加4.4.6编译器的路径即可
/home/tarena/workdir/toolchains/opt/S5PV210-crosstools/4.4.6/bin
保存退出
3.source /etc/environment //重新生效新的环境变量
4.arm-linux-gcc -v //查看编译器的版本
5.which is arm-linux-gcc //查看编译器的路径是否正确
4.部署uboot(代码利用官方的)
1.解压源码
tar -jxvf / tar -zxvf / tar -jcvf /tar -zcvf
2.清除源码中的配置文件和目标文件,上一次编译的结果
make distclean
3.针对具体的CPU和开发板进行配置源码
make cw210_config //cw210_config配置选项来自 Makefile
4.make all //编译,结果u-boot.bin
5.烧写(JTAG,USB,SD,UART)
6.涉及代码的修改:重点关注一个头文件:
include/configs/cw210.h //全是开发板的硬件配置信息
5.kernel内核(使用官方的)
1.解压内核源码
2.清除源码的目标,配置信息
make distclean //只做一遍,以后不用做!
3.要针对CPU和开发板进行配置
咱们使用的开发板的配置如下:
参考实验步骤
如果使用其他的开发板标准配置如下:
make xxx_defconfig
或者
cp arch/arm/configs/xxx_defconfig .config
如果不支持,不配置,默认会针对X86架构!
4.make menuconfig //做三个检查
检查是否支持ARM架构
检查是否支持当前CPU
检查是否支持当前开发板
5.make zImage /make uImage
6.cp arch/arm/boot/zImage /tftpboot
7.内核移植或者驱动开发,都需要多多看内核的平台代码文件
arch/arm/mach-s5pv210/mach-cw210.c
6.根文件系统rootfs(体力活)
利用busybox进行制作
7.系统启动引导
关键看uboot的两个参数:bootcmd,bootargs
bootcmd:用于加载内核到内存,然后启动内核
bootargs:内核启动以后,用于内核挂接根文件系统
软件开发前期一般都使用NFS网络文件系统:
setenv bootcmd tftp 20008000 zImage \;bootm 20008000
setenv bootargs root=/dev/nfsnfsroot=192.168.1.8:/opt/rootfsip=192.168.1.110:192.168.1.8:192.168.1.1:255.255.255.0::eth0:on init=/linuxrcconsole=ttySAC0,115200
saveenv
注意事项:
1.init=/linuxrc信息可以不用写,如果不用写,启动的第一个进程为/sbin/init进程,如果/sbin/init没有,启动第一个进程/bin/init,如果它也没有,就执行/bin/sh(如果这行/bin/sh以后,会造成rcS和profile无法得到执行,所以千万要注意init=/bin/sh这种写法)
2.给内核传递启动参数,不仅仅可以通过uboot的bootargs,还可以通过内核给自己传递参数!
cd /opt/kernel
make menuconfig
Boot options --->
(console=ttySAC2,115200) Default kernelcommand string
//光标移动到这个位置,然后按回车键进行编辑,例如采用NFS网络文件系统启动:
root=/dev/nfs nfsroot=...
[ ] Always use the default kernel command string //如果这个选项选择为*,内核使用自己的参数信息,否则使用uboot的bootargs参数
查看内核的启动参数信息:
cat /proc/cmdline
实验步骤:
1.从ftp下载官方内核源码:
Kernel_2.6.35.7_CW210_for_Linux_v1.0.tar.gz
2.修改/opt/的用户和组
sudo chown tarena /opt -R
sudo chgrp tarena /opt -R
把源码包放置在/opt/目录
3.解压内核源码
tar -xvfKernel_2.6.35.7_CW210_for_Linux_v1.0.tar.gz
mv cw210... kernel //重命名为kernel目录
4.cd /opt/kernel
make distclean //清除
cp config_CW210_linux_V1.0 .config //进行配置
5.makemenuconfig //三个检查
System type->
ARM system(SAMSUNG S5PV210...)
...
board ... (smdkv210) //开发板
6.make zImage
cp arch/arm/boot/zImage /tftpboot
7.根文件系统一律是/opt/rootfs
cp 做好的rootfs /opt/ -frd
sudo vim /etc/exports/ 添加/opt/rootfs
sudo /etc/init.d/nfs-kernel-server restart
8.uboot设置启动参数
setenv bootcmdtftp 20008000 zImage \; bootm 20008000
setenv bootargs root=/dev/nfsnfsroot=192.168.1.8:/opt/rootfsip=192.168.1.110:192.168.1.8:192.168.1.1:255.255.255.0::eth0:on init=/linuxrcconsole=ttySAC0,115200
saveenv
9.结果:使用官方内核启动NFS网络文件系统
注意:嵌入式linux开发,玩的是硬件,如果软件没有问题,一定要注意硬件是否存在问题,通过更换硬件对比测试!
问题:
Root-NFS: Serverreturned error -13 while mounting /opt/rootfs :原因是PC的NFS网络服务没有开启,并没有指定共享目录
问题:如果PC的网络服务都启动,并且bootargs也指定了,如果还出现无法挂接NFS ,要注意内核需要添加NFS网络文件系统的支持:
make menuconfig
File system->
networking file system->
<*>NFS client support
<*>Root file system on NFS (重要)
<*>NFS server support
问题:
/dev/console:不允许操作
/dev/null:不允许操作
答案:甭搭理
***********************************************************************************
linux系统分为用户空间和内核空间:
用户空间:包含用户编写的应用软件,C库
整个4G虚拟地址空间,用户空间包含了0~3G
每个用户进程都有自己独立的3G空间
内核空间:包含驱动,文件系统,平台代码等等,内核空间包含了剩余1G(3G~4G),内核1G空间对于所有的进程都是共享
用户空间和内核空间的划分本质上要依赖ARM的工作模式,
用户空间的软件在运行时,CPU处于USR模式,内核空间的软件运行时,CPU处于SVC模式,这种模式划分,决定了用户空间的软件和内核空间的软件在访问资源时,具有的权限是不一样的!
注意事项:
1.用户空间的软件不能直接访问内核空间的地址,包括代码和数据,例如一个应用程序不能调用驱动的某个函数!
2.用户空间不能直接访问硬件资源,例如,一个应用程序不能直接访问CPU的GPIO寄存器!
3.用户空间的软件和内核空间软件进行交互,必须通过唯一的途径--系统调用(open,close,read,write,ioctl,mmap,fork,exit...)
4.用户软件利用系统调用进入内核空间,内核会给这个进程重新分配一个内核栈(8K),在内核空间编程时,要注意局部变量的大小!
5.由于空间的划分依赖ARM的工作模式,也就决定了他们访问资源的权限不同,起到操作系统的保护。例如,如果在应用程序访问NULL指针,操作系统有权干掉这个应用程序。如果在内核编程时,访问NULL指针,操作系统崩溃!
6.类似printf,malloc这些都是标准库函数,read,write等都是系统调用函数,这些函数的实现都是在C库中。
案例:向终端打印输出hello,world
prinf("hello,world");最终调用write
write(1, "hello,world",strlen("hello,world"));
查看应用程序运行的过程:strace ./a.out
linux内核(zImage)包含7大子系统
1.设备驱动
2.内存管理
3.网络协议栈
4.进程管理
5.系统调用
6.平台代码
7.文件系统
linux内核配置编译过程:
回顾:* m Kconfig Makefile
案例:LM77温度传感器,实现内核这个传感器驱动。
cd /opt/kernel
make menucofig
按键"/"搜索关键字"LM77",提示信息如下:
│ Symbol: SENSORS_LM77 [=n] │
│ Prompt: National Semiconductor LM77 │
│ Defined atdrivers/hwmon/Kconfig:509 │
│ Depends on: HWMON [=y]&& I2C [=y] │
│ Location: │
│ -> Device Drivers │
│ -> HardwareMonitoring support (HWMON [=y])
以上信息说明,内核支持这个驱动!
Symbol:SENSORS_LM77-》CONFIG_SENSORS_LM77
Location: │
│ -> Device Drivers │
│ -> HardwareMonitoring support (HWMON [=y])
代表这个配置选项的位置,只需选中为*
问:通过以上的配置信息,如果找到源代码?
zhangsan.c
Kconfig:
config ZHANGSAN->CONFIG_ZHANGSAN
......
Makefile
obj-$(CONFIG_ZHANGSAN)+= zhangsan.o
如果选中为*->CONFIG_ZHANGSAN=y -》
obj-y +=zhangsan.o //静态编译
如果选择为M-》CONFIG_ZHANGSAN=m
obj-m +=zhangsan.o //模块化编译
通过CONFIG_SENSORS_LM77,在Makefile中进行搜索,找到对应的源码
问:如果找到源码,如何找到对应的配置选项信息?
***********************************************************************************
一些常用命令:
1.搜索匹配字符串命令:
grep "zhangsan" ./*(指定目录下的所有文件) -R
在指定目录下的所有文件中(.表示当前目录,*表示所有文件)查找指定的字符串,-R表示递归到子目录查找
2.在指定的目录下查找文件:
find .(指定目录) -name filename
在指定目录下找文件filename
3.vim分屏:
(1)左右分屏:进入vim的命令行模式,键入vs文件名,
例如:在已经用vi打开的hello.c下的命令行下,输入vs swap.c
(2)上下分屏:进入vim的命令行模式,进入sp文件名
例如:在已经用vi打开的hello.c下的命令行下,输入sp swap.c
(3)屏幕切换:ctrl + ww
在分屏模式下,用ctrl+ww 来进行屏的切换
vim自动补全:ctrl + n
行选:shift +v
列选:ctrl + v
方向键:hjkl
4.复制、删除
命令行下:
n,m coh 将从n行到m行的内容复制到第h行之后,例如:5,10 co 12
n,mdel 将从n行到m行的内容删除,例如:5,10 del
不在命令行,也不在编辑模式下,而在一般模式下
n yy 从光标所在行开始,复制n行
p将yy复制的内容粘贴到光标所在行的下一行
n dd 从光标所在行开始,删除n行
-------------------------------------------------------------------------------------------------------------------------------------------------------
总结:
在一个新的板子上跑操作系统
(1)电脑装linux系统
(2)装vim 配置,插件
(3)装tftp、nfs服务,并配置
(4)装交叉编译器arm-linux-gcc
(5)编译开发板配套u-boot
(6)编译开发板配套kernel
(7)制作根文件系统,利用busybox