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,内核,根文件系统,代码都是官方提供的!

案例:某位同学上班,老板给一个TIARM开发板,需要一周时间把系统跑起来!

实施步骤:

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

nmdel 将从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


0 0