zoukankan      html  css  js  c++  java
  • Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建

    /***********************************************************************************
     *                    
     *                      linux 3.5,U-Boot,Busybox,SD卡启动环境搭建
     *
     *  声明:
     *      1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会
     *          不对齐,从而影响阅读.
     *      2. 以下所有的shell命令都是在root权限下运行的;
     *      3. minicom(U-Boot)指的是用minicom连接开发板做为U-Boot的终端;
     *      4. 文中在需要往文件中写入内容的时候使用了如下2方式:
     *          1.如果文件不存在,创建文件;如果存在,以覆盖的方式往文件中添加内容:
     *              cat > 文件名 << EOF (结束符)
     *              ...
     *              文件内容...
     *              ...
     *              EOF (输入遇到EOF,cat指令结束,内容将保存在前面指定的文件名中)
     *          2.如果文件不存在,创建文件;如果存在,将内容追加到文件尾:
     *              cat >> 文件名 << EOF (结束符)
     *              ...
     *              文件内容...
     *              ...
     *              EOF 
     *
     *                                          2015-3-7 阴 深圳 尚观 Sbin 曾剑锋
     **********************************************************************************/
    
                            \\\\\\\--*目录*--/////////////
                            |   一. 预热文章;                   
                            |   二. 内核源码树介绍;             
                            |   三. 配置交叉编译器;             
                            |   四. 内核编译流程以及原理;       
                            |   五. 安装并配置minicom程序;      
                            |   六. U-Boot编译;                 
                            |   七. U-Boot SD卡启动;            
                            |   八. Android fast_boot SD卡启动; 
                            |   九. 使用Busybox制作文件系统;    
                            |   十. NFS配置;                    
                            \\\\\\\\\//////////////////
    
    
    一. 预热文章:
        1. 计算机是如何启动:
            http://www.ruanyifeng.com/blog/2013/02/booting.html
        2. Linux 的启动流程:
            http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html
        3. Unix目录结构的来历:
            http://lists.busybox.net/pipermail/busybox/2010-December/074114.html
            http://www.ruanyifeng.com/blog/2012/02/a_history_of_unix_directory_structure.html
    
    二. 内核源码树介绍:
        1. arch(architecture):  与平台架构相关的文件
        2. block:               块设备IO调度策略实现
        3. COPYING:             版权声明
        4. crypto:              常用加密,校验方法实现
        5. Documentation:       内核官方文档
            zh_CN:              中文翻译文档
        6. drivers:             设备驱动程序
        7. fs(file system):     文件系统实现
        8. include:             内核头文件
        9. init:                内核启动代码
        10. ipc(inter process communication): 进程间通信实现
            1. signal           信号
            2. pipe             无名管道
            3. named pipe(FIFO) 命名管道
            4. message queue    消息队列
            5. shared memory    共享内存
            6. semaphore        信号量
            7. socket           套接字
        11. kernel:             内核核心代码
        12. lib(library):       通用库实现
        13. mm(memory manage):  内存管理方法实现
        14. net:                网络协议栈实现
        15. samples:            内核示例代码
        16. scripts:            内核编译工具
        17. sound:              与音频相关代码
            1. oss(open sound system)
            2. alsa(advance linux sound 
    
    三. 配置交叉编译器:
        1. tar xf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
        2. cp opt/* /opt -r
        3. cat >> ~/.bashrc << EOF (配置环境变量,以方便使用交叉编译器)
            PATH=$PATH:opt/FriendlyARM/toolschain/4.5.1/bin
            EOF
        4. source ~/.bashrc (使前面的配置的PATH生效)
        5. 检查是否已配置好:
            在终端输入: arm后按两下tab出现如下表示正常
                arm-linux-addr2line               arm-none-linux-gnueabi-addr2line
                arm-linux-ar                      arm-none-linux-gnueabi-ar
                arm-linux-as                      arm-none-linux-gnueabi-as
                arm-linux-c++                     arm-none-linux-gnueabi-c++
                arm-linux-cc                      arm-none-linux-gnueabi-cc
                arm-linux-c++filt                 arm-none-linux-gnueabi-c++filt
                arm-linux-cpp                     arm-none-linux-gnueabi-cpp
                arm-linux-g++                     arm-none-linux-gnueabi-g++
                arm-linux-gcc                     arm-none-linux-gnueabi-gcc
                arm-linux-gcc-4.5.1               arm-none-linux-gnueabi-gcc-4.5.1
    
    四. 内核编译流程以及原理:
        1. make menuconfig
            1. 程序会运行: scripts/kconfig/mconf Kconfig
            2. 配置完保存后,在内核树的根目录下生成: .config文件,是隐藏文件;
            3. Kconfig的语法请参考: Documentation/kbuild/kconfig-language.txt
        2. make -j2 zImage
            1. 参数-j2是开启2个线程来编译内核,zImage编译目标;
            2. 程序会运行: scripts/kconfig/conf .config,生成如下文件:
                1. include/config/auto.conf: 用于Makefile中的的模块编译选择;
                    CONFIG_MENU3=y
                    CONFIG_M2=y
                2. include/generated/autoconf.h: 用于内核源代码的#ifdef/#ifndef;
                    #define CONFIG_MENU3 1
                    #define CONFIG_M2 1
            3. 根据上面的auto.conf和autoconf.h,将内核中的.c文件编译成.o文件;
            4. 再把每个目录下的.o通过ar命令打包在built-in.o放到上一级目录中,
               所以每个目录都有一个built-in.o
            5. 以此类推,在源码目录的顶级目录会得到一个built-in.o文件并转换为vmlinux.o
            6. vmlinux.o经过链接器链接(ld)得到vmlinux
            7. 因为内核是运行在裸板上的,所以需要去掉elf文件头,得到了二进制Image文件;
            8. Image经过gzip压缩以后得到了最终的zImage文件;
            9. 可以通过nm vmlinux内核符号,查看需要的驱动没有编译进内核,当然也可以通过
               查看内核根目录下的System.map中的地址符号表,这跟U-Boot一样.
    
    五. 安装并配置minicom程序:
        1. 安装minicom: yum install minicom
        2. 通过USB转串口线连接开发板与电脑,运行命令: ls /dev/
            找到对应的设备节点,本文假设开发板对应的设备节点是:/dev/ttyUSB0
        3. 配置minicom:
            1. 在终端: minicom -s
            2. 进入界面后: 选Serial port setup     
            3. 当使用usb转串口时,Serial Deveice: /dev/ttyUSB0
                +-------------------------------------------+
                | A -    Serial Device      : /dev/ttyUSB0  |
                | B - Lockfile Location     : /var/lock     |
                | C -   Callin Program      :               |
                | D -  Callout Program      :               |
                | E -    Bps/Par/Bits       : 115200 8N1    |
                | F - Hardware Flow Control : No            |
                | G - Software Flow Control : No            |
                |                                           |
                |    Change which setting?                  |
    
            4. 照上面设好后,选 Save setup as dfl保存为默认配置 
    
    六. U-Boot编译:
        1. make tiny4412_config //(对应的内容可在boards.cfg里查询)
        2. make //编译完成后u-boot.bin就是所要的文件,u-boot.bin是把u-boot文件
                //的elf文件信息去除后得来的
    
    七. U-Boot SD卡启动(假设SD卡挂载在/dev/sdb,并且进入U-Boot根目录):
        1. 往SD卡中烧写U-Boot: uboot_tiny4412/sd_fuse/tiny4412/sd_fusing.sh /dev/sdb 
            运行结果会自动分如下2个区:
                1. /dev/sdb1
                2. /dev/sdb4
        2. 采用vfat格式格式化/dev/sdb1分区,用于放zImage:   mkfs.vfat /dev/sdb1 
        3. 采用ext4格式格式化/dev/sdb4分区,用于放文件系统: mkfs.ext4 /dev/sdb4 
        4. 重新拔插SD卡,把生成上面生成的zImage放入/dev/sdb1分区中,文件系统放在/dev/sdb4分区中;
        5. 将SD卡插入开发板,选择SD卡启动,打开minicom;
        5. 安装dnw: tar xf dnw-linux.tar.gz && cd dnw-linux && make && make install
        6. dnw测试zImage是否可行:
            1. minicom(U-Boot)里面: dnw 0x40008000
            2. PC侧命令:            dnw arch/arm/boot/zImage (在内核根目录下运行命令)
            3. minicom(U-Boot)里面: bootm 0x40008000
        7. minicom(U-Boot)命令查看SD卡中的zImage是否存在: fatls mmc 0:1
        8. minicom(U-Boot)加载zImage到内存0x40008000: fatload mmc 0:1 0x40008000 zImage
        9. minicom(U-Boot)启动内核: bootm 0x40008000
        10. minicom(U-Boot)修改bootcmd: set bootcmd "fatload mmc 0:1 0x40008000 zImage;bootm 0x40008000"
        11. minicom(U-Boot)保存: save
        12. minicom(U-Boot)重启: reset
    
    八. Android fast_boot SD卡启动(需要在前面U-Boot SD卡启动的基础上操作):
        1. minicom输入U-Boot命令即可对SD卡进行分区: fdisk -c 0 320 806 518
        2. 重新分区后,可重新格式化FAT分区,minicom输入U-Boot命令: fatformat mmc 0:1
        3. 使用USB线连接Tiny4412的MICRO_USB口到PC,然后minicom输入U-Boot命令: fastboot
        4. 在PC端将fastboot脚本拷贝到$PATH目录下,当然你也许会没有fastboot,问度娘要吧;
        5. 在PC端输入以下命令进行烧写: fastboot flash kernel zImage(烧写kernel)
        6. zImage传输完的时候minicom会出现假死状态,按ctrl+c退出fastboot命令状态;
        7. minicom(U-Boot)加载zImage到内存0x40008000: movi read kernel 0 40008000
        8. minicom(U-Boot)启动内核: bootm 0x40008000
        9.  minicom(U-Boot)修改bootcmd: set bootcmd "movi read kernel 0 40008000;bootm 0x40008000"
        10. minicom(U-Boot)保存: save
        11. minicom(U-Boot)重启: reset
    
    九. 使用Busybox制作文件系统(本文假设nfs文件系统在PC端的/disk/A9/filesystem文件加下):
        1. make menucofig,在弹出来的对话框中选择一下内容:
            1. Busybox Settings --> Build Options --> [*] Build BusyBox as a static binary (no shared libs) 
            2. Busybox Settings --> Build Options --> (arm-linux-) Cross Compiler prefix
        2. mkdir /disk/A9/filesystem -p (假设/disk/A9/filesystem为nfs提供的目录)
        3. make && make install CONFIG_PREFIX=/disk/A9/filesystem
        4. cd /disk/A9/filesystem && mkdir dev etc sys proc mnt tmp
        5. cat > etc/init.d/rcS << EOF  (rcS:run command Start)
            mount -t ramfs none /dev
            mount -t sysfs none /sys
            mount -t proc  none /proc
            mount -t tmpfs none /tmp
            #采用设备模型进行创建设备节点的必须加上,热插拔处理,为后面的是用驱动模型作准备
            echo "/sbin/mdev" > /proc/sys/kernel/hotplug
            /sbin/mdev  -s
            EOF
        6. mknod dev/console c 5 1
        7. cat > etc/inittab << EOF
            ::sysinit:/etc/init.d/rcS
            ttySAC0::askfirst:-/bin/sh #/bin/sh前面的-表示sh会默认加载/etc/profile
            EOF
        8. cat > etc/profile << EOF
            export PS1="[^_^ W]# " #设置命令提示前面的那段文字
            EOF
        9. mkdir lib && cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/* lib
        10. chmod 777 /disk/A9/filesystem -R --> 给nfs访问所有的权限
        11. 文件系统制作完毕,如果想要将文件系统保存到SD卡中,请保存在第四个分区中;
        12. minicom(U-Boot)里面查看到文件系统的文件夹: ext2ls mmc 0:4 /
        13. SD卡文件系统bootargs设置: set bootargs "root=/dev/mmcblk0p4 console=ttySAC0,115200 lcd=S70"
    
    十. NFS配置(本文假设PC机的IP在局域网100段):
        1. 关闭防火墙(iptables),关闭selinux
        2. PC侧设置:
            1. 设置PC的IP: ifconfig eth0 192.168.100.22
            2. cat >> /etc/exports << EOF
                /disk/A9/filesystem *(rw)
                EOF
            3. service nfs restart
            4. showmount -e 192.168.100.22   --> 查看该目录是否已经发布出去
        3. U-Boot设置(通过minicom设置)
            1. 开发板IP: 192.168.100.111
            2. NFS服务器IP: 192.168.100.22
            3. 网关: 192.168.100.1
            4. 子网掩码: 225.225.225.0
            5. NFS文件系统启动,U-Boot bootargs设置: set bootargs "root=/dev/nfs nfsroot=192.168.100.22:/disk/A9/filesystem ip=192.168.100.111 console=ttySAC0,115200 lcd=S70"
  • 相关阅读:
    代码编写原则
    换个角度看世界
    不使用nib 文件时,需要改变一个view 的大小时,需要为viewcontroller添加loadView方法
    建议:一般地,建议使用xcode 4.3开发app 而不是使用xcode4.5
    iOS 5解决Could not instantiate class named NSLayoutConstraint问题
    访问对象方法比较
    让一个view 或者控件不支持拖拽
    Java Map遍历方式的选择
    Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)
    java List集合记录 ArrayList和LinkedList的区别
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4320880.html
Copyright © 2011-2022 走看看