基於s3c2410的ARMer9開發平台的使用

admin @ 2014-03-25 , reply:0

我的宿主機操作系統是RedHat9.0(建議安裝的時候選擇“完全安裝”)
一個嵌入式Linux系統從軟體的角度來看,分為四個層次:

  1. Boot Loader. 包括固化在固件(firmware)中的 boot 代碼(可選),和 Boot Loader 兩大部分。
  2. Linux kernel. 特定於嵌入式板子的定製內核以及內核的啟動參數。
  3. File system. 包括根文件系統和建立於 Flash 內存設備之上的文件系統。通常用 ramdisk 來作為root fs。
  4. User application. 特定於用戶的應用程序。有時在用戶應用程序和內核層之間可能還會包括一個嵌入式圖形用戶界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 等等。

以下是開發環境搭建過程中涉及到的知識點

一. minicom的使用
minicom是Linux OS下功能強大的串口終端程序。具體使用方法在此不詳述,有很多相關資料可供查閱。
NOTE:在minicom的設置中,波特率要設置正確(否則,終端上是亂碼),軟體流控制和硬體流控制都應設置為“無”或“NO”。
minicom的設置被保存到文件/etc/minirc.dfl中。
進入有顏色的minicom界面:# minicom -m8 -c on

二. 配置tftp伺服器
在這裡,我是通過網路下載kernel image和root fs到開發板的。
tftp伺服器是由超級守護進程xinetd運行的,這使得tftp伺服器的配置操作比獨立運行守護進程的伺服器(如 vsftpd)簡單得多。一般,修改文件/etc/xinetd.d/tftp,當然,只有安裝了tftp伺服器,才會有這個文件。把“disable = yes”改成“disable = no”,然後保存,退出。重新啟動超級守護進程xinetd,# service xinetd restart.把要下載的文件放到根目錄下的tftpboot子目錄中就ok了。
NOTE:在控制台終端輸入“setup”,選中system services,回車進入系統服務選項菜單,選中[*] tftp(如果沒有tftp服務,說明RedHat9.0安裝的時候沒有選擇tftp服務,可以去安裝包映像或安裝光碟中找到相應的rpm包安裝,ok),保存,退出setup界面。

三. 建立NFS文件系統
NFS是由SUN公司發展出來的分散式文件系統。可以讓用戶通過連接的網路,將其他電腦所共享的文件目錄,映射到自己的系統下。用戶在操作這些文件和目錄時,感覺如同存儲在本機上一樣。共享出目錄的一方稱為NFS服務端,另一端稱為NFS客戶端。這裡,當然是在開發板和宿主機之間建立NFS共享。
NOTE:首先確認宿主機上安裝了NFS(查看目錄/etc/xinetd.d/下是否存在nfs文件)。
NFS伺服器端操作如下:

  1. 配置宿主機的乙太網口
    # ifconfig eth0 down
    # ifconfig eth0 192.168.1.1 up
  2. 在宿主機上建立目錄/home/emdeder/nfs
  3. 編輯/etc/exports文件如下:
    /home/embeder/nfs 192.168.1.2(rw,sync,no_root_squash)
    允許IP為192.168.1.2的ARMer9開發系統將宿主機上的/home/embeder/nfs這個目錄mount到開發系統下,即,ARMer9開發系統可以通過網路訪問宿主機上的/home/embeder/nfs目錄。
  4. 執行/etc/init.d目錄下的程序nfs,重啟NFS Server
    # cd /etc/init.d
    # exportfs -rav
    # ./nfs restart

NFS客戶端的操作如下:

  1. 啟動ARMer9開發系統上的Linux系統。
  2. 配置ARMer9開發系統上的乙太網口
           # ifconfig eth0 down
           # ifconfig eth0 192.168.1.2 up
  3. ping一下宿主機,看ARMer9開發系統和宿主機的網路是否相通
           # ping -c 5 192.168.1.1
  4. 在ARMer9開發系統中建立目錄/tmp/nfs
           # mkdir /tmp/nfs
  5. 若相通,則將宿主機上的目錄/home/embeder/nfs mount到ARMer9開發系統下的目錄/tmp/nfs上。
           # mount -t nfs -o nolock 192.168.1.1:/home/embeder/nfs /tmp/nfs
  6. 進入目錄/tmp/nfs,查看該目錄下的內容,是否和宿主機上的目錄/home/embeder/nfs中的內容一樣?^_^,應該是一樣的。

      下面就可以用這種方式在開發板上調試自己的應用程序了。

三. 編譯內核
這裡,我已經有了目標開發系統的Linux移植源代碼,否則,移植是一項煩雜的事情,有時間的話,這也是一件很值得嘗試的事情。
編譯內核的軟體環境是KBuild系統,泛指構建一個完整並能夠運行的Linux內核所需要的一切資源。這些資源包括構建程序,腳本,中間件,配置文件和Makefile。依次進行以下操作:
       # make menuconfig     進入Linux內核配置界面。
NOTE:在block device中選上ramdisk的支持並且根據需要修改ramdisk的默認大小,並且選上initrd的支持。還有,在file system中選上自己文件系統所用格式的相應支持(這裡是ext3),否則,kernel將不能正確引導文件系統(一般出現kernel panic提示信息)。
我在這裡靜態編譯進了目標開發板的音效卡驅動,即Philip uda1341,在sound選項裡面,當然,也可以用module的方式編譯。
       # make dep
kbuild調用中間件Script/mkdep來生成描述與核心文件形成依賴關係的.h文件(絕大多數)列表。這個列表保存在 .depend 中。用戶即使不執行這一步,kbuild也會執行的。
       # make clean
清除上次編譯生成的 .o 文件。
       # make zImage
構建內核映像
       # make modules
編譯被配置為模塊的內核組件
       # make modules_install
把編譯好的內核模塊按照功能copy到/lib/modules/2.4.23目錄下
編譯后,可安裝模塊將被存放的宿主機目錄是:
/tmp/lib/modules/2.4.18-rmk7-pxa1/
驅動模塊所在目錄 /tmp/lib/modules/2.4.18-rmk7-pxa1/kernel/driver

四. kernel和ramdisk的U-Boot可啟動映像文件的製作
uboot源代碼的 tools/ 目錄下有mkimage工具,這個工具可以用來製作不壓縮或者壓縮的多種可啟動映象文件。
mkimage在製作可啟動映象文件的時候,是在原來的可執行映象文件的前面加上一個0x40位元組的頭,記錄 mkimage 的參數所指定的信息,這樣uboot才能識別這個映象是針對哪個CPU體系結構的,哪個OS的,哪種類型,載入到內存中的哪個位置,入口點在內存中的哪個位置以及映象名是什麼。
       root@Glym:/tftpboot# ./mkimage
       Usage: ./mkimage -l image
          -l ==> list image header information
              ./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
          -A ==> set architecture to 'arch'
          -O ==> set operating system to 'os'
          -T ==> set image type to 'type'
          -C ==> set compression type 'comp'
          -a ==> set load address to 'addr' (hex)
          -e ==> set entry point to 'ep' (hex)
          -n ==> set image name to 'name'
          -d ==> use image data from 'datafile'
          -x ==> set XIP (execute in place)
       參數說明:
       -A 指定CPU的體系結構: 
       取值              表示的體系結構
       alpha             Alpha              
       arm               ARM              
       x86               Intel x86
       ia64               IA64
       mips              MIPS
       mips64          MIPS 64 Bit
       ppc               PowerPC
       s390              IBM S390
       sh                  SuperH
       sparc             SPARC
       sparc64         SPARC 64 Bit
       m68k            MC68000 

       -O 指定操作系統類型,可以取以下值:
       openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、
       dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos 

       -T 指定映象類型,可以取以下值:
       standalone、kernel、ramdisk、multi、firmware、script、filesystem 

       -C 指定映象壓縮方式,可以取以下值:
       none   不壓縮
       gzip   用gzip的壓縮方式
       bzip2  用bzip2的壓縮方式 

       -a 指定映象在內存中的載入地址,映象下載到內存中時,要按照用mkimage製作映象時,這個參數所指定的地址值來下載 

       -e 指定映象運行的入口點地址,這個地址就是-a參數指定的值加上0x40(因為前面有個mkimage添加的0x40個位元組的頭) 

       -n 指定映象名 

       -d 指定製作映象的源文件

例:製作PowerPC體系結構,vxworks操作系統的不壓縮kernel映象,準備下載到內存地址0x800000位置,映象名稱為vxworks.image:
       root@Glym:/tftpboot# ./mkimage -A ppc -O vxworks -T kernel -C none -a 0x800000 -e 0x800040 -n vxworks.image -d vxWorks image
最後會生成一個文件名稱為image的映象文件,這個文件就是我們所需要的了。請注意-n參數中指定映象名不是生成的映象文件地文件名,映象名是記錄在0x40個位元組的頭部信息中的。 

五. 用U-Boot下載Linux kernel和root fs到目標開發板(在不同的開發板上,下載地址可能不同)。
       # setenv ipaddr 192.168.1.2
       # setenv serverip 192.168.1.1  (確保開發板和宿主機在同一網段)
       # tftpboot 0x30007fc0 uImage.s3c2410-f
       # tftpboot 0x30800000 ramdisk.u-boot-f
       # bootm 0x30007fc0 0x30800000

如果要下載檔案並且寫入到NOR Flash中,方法如下:
把uImage.s3c2410-f通過tftp download到SDRAM中的0x30007fc0的位置
SMDK2410> tftpboot 0x30007fc0 uImage.s3c2410-f
將0x30007fc0位置開始長度為0x100000(即1M,這個長度取決於uImage.s3c2410-f的大小,比uImage.s3c2410-f的大小要大,在256K位元組的邊界上即可)的位元組燒寫到flash中(地址為0x200000)
SMDK2410> cp.b 0x30007fc0 0x200000 0x100000
把ramdisk.u-boot-f通過tftpdownload到SDRAM中的0x30800000 的位置
SMDK2410> tftpboot 0x30800000 ramdisk.u-boot-f
將0x30007fc0位置開始長度為0x1000000(即16M,這個長度取決於ramdisk.u-boot-f的大小,比ramdisk.u-boot-f的大小要大,在256K位元組的邊界上即可)的位元組燒寫到flash中(地址為0x800000)
SMDK2410> cp.b 0x3080000 0x800000 0x1000000
這時候,linux kernel和ramdisk已經保存到flash的0x200000和0x800000這兩個位置了。
如果不需要每次起來自動啟動linux,就在複位後進入u-boot命令界面,輸入下面的命令即可:
       SMDK2410> cp.b 0x200000 0x30007fc0 0x100000
       SMDK2410> cp.b 0x800000 0x30800000 0x1000000
       SMDK2410> bootm 0x30007fc0 0x30800000
如果想每次複位后自動啟動linux,就把上面3條命令通過setenv命令設置到u-boot的環境變數bootcmd中。 
       SMDK2410>setenv bootcmd cp.b 0x200000 0x30007fc0 0x100000; cp.b 0x800000 0x30800000 0x1000000; bootm 0x30007fc0 0x30800000
       SMDK2410>protect off 0x00040000 0x0007ffff
       SMDK2410>saveenv
       SMDK2410>protect on 0x00040000 0x0007ffff

六. 基於s3c2410嵌入式處理器的開發板上,mp3播放程序madplay編譯總結
1. 編譯zlib,因為libid3tag需要這個庫
       # ./configure --prefix=/opt/host/armv4l/
   修改Makefile
   AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar
   CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
   RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib
   最後AR命令要添加rcs,否則會出錯
   具體操作:
   libz.a : $(OBJS)$(OBJA)
   $(AR) rcs$@$(OBJS)$(OBJA)
   -@($(RANLIB)$@||true)>/dev/null 2>&1
       # make
       # make install

2. 編譯libid3tag
       # ./configure --host=armv4l-unknown-linux
       CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
       --disable-debugging --disable-shared
       --prefix-/opt/host/armv4l/
       # make
       # make install

3. 編譯libmad
       # ./configure --enable -fpm=arm --host=armv4l-unknown-linux
       --disable-shared --disable-debugging
       --prefix=/opt/host/armv4l/
       CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
       # make
       # make install
4. 編譯madplay
       # ./configure --host=armv4l-unknown-linux
       CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
       --disable-debugging
       --disable-shared
       CPPFLAGS='-I/opt/host/armv4l/include'
       LDFLAGS='-L/opt/host/armv4l/lib'
       # make

NOTE:可以在Makefile里加上 -static 選項,從而得到靜態鏈接的程序。
另外,madplay官方主頁是:www.underbit.com
zlib下載地址是:http://www.zlib.net,當前版本是zlib 1.2.3 (2005.7)

七.root文件系統的製作
Ramdisk是分配了一部分內存作為一個分區來使用。對於系統運行時不斷使用的程序,將它們放在Ramdisk中將加快計算機的操作,如大數據量的網路伺服器、無盤工作站等。為了能夠使用Ramdisk,我們在編譯內核時須將block device中的Ramdisk支持選上,它下面還有兩個選項,一個是設定Ramdisk的大小,默認是4096k;另一個是initrd的支持。它既可以直接編譯進內核,也可以編譯成模塊,在需要的時候載入。如果在啟動時就用它(例如載入ramdisk作為rootfs),就必須將它直接編譯進內核。
在Linux下建立目錄/myramdisk,將在此目錄下創建的文件系統對應的文件結構。一般不需要對於系統運行是完全無用的文件,如幫助手冊、信息頁,頭文件、內核源碼等。
General:要建立的目錄是,dev,設備;etc,系統配置文件;sbin,重要的系統程序;bin,基本應用程序;lib,共享函數庫;mnt,裝載其他磁碟節點;usr,附加應用程序;proc,proc文件系統;其中,proc,mnt,usr可以是空的。
一些要包含在 Ramdisk 中的重要目錄是:
/bin — 保存大多數如 init、busybox、shell、文件管理實用程序等二進位文件;
/sbin — 保存系統啟動過程通常需要的命令,如e2fsck、mke2fs、fdisk、insmod、rmmod、depmod、modprobe、lsmod、shutdown、reboot、login、init、getty、mount、umount、等;
/dev — 包含用在設備中的所有設備節點,一定要有的是console,kmem,mem,null,ram,tty* 等文件;
/etc — 包含必不可少的系統配置文件,一般包含rc.d/* (系統啟動腳本),fstab(列出要登陸的文件系統),inittab(包含啟動過程參數),passwd(用戶名和目錄),group(用戶組),shadow(用戶加密密碼)。如果不使用init作為登陸進程,而將init鏈接到/bin/bash,即,#ln –s /bin/bash /sbin/init,則/etc目錄下可以不含任何文件,這種情況類似單用戶登陸系統,同樣,也不需要輸入用戶名和密碼;
/proc — 這是一個必須設置的特殊目錄,在系統運行之後它下面有許多內容,這些內容是實時、不斷跟蹤系統內核和正在運行的進程的狀態而產生的,但不佔用任何磁碟空間,而是駐留在內存中;在某些情況下,可以通過它來進行系統設置,許多工具從這裡獲取信息,如dmesg、ps、top等;在內核編譯選項文件系統選擇中,我們選擇對文件系統proc的支持;
/lib — 包含所有必需的庫,根據/bin和/sbin目錄下的可執行文件需要的動態鏈接庫來確定lib目錄下的內容,其中必須有函數裝載器,或是ld.so(對a.out庫)或是ld-linux.so(對ELF庫)。 

文件系統製作完成,看看這個/myramdisk目錄大小為多大,然後確定需要多大的Ramdisk,在內核編譯的時候,修改Ramdisk大小(預設為4096k)為所需要的尺寸。
現在我們以製作一個4M的Ramdisk為例子,步驟如下:
1.      在宿主機上編譯運行在目標機linux內核時,將block device中的Ramdisk支持選上,設定Ramdisk的大小為預設的4096K,對initrd的支持也選上。
2.      在宿主機上建立/myramdisk目錄,按照上述的原則建立必要的目錄和文件。
3.      執行下列步驟: 

  1. 在根目錄下建立一個文件 /images/initrd.img,從設備文件/dev/zero中讀取數據填充文件initrd.img(NOTE:/dev/zero是一個特殊的設備文件,從這個文件讀出來的數據全是0,以便後面得到更高的壓縮率);
    # mkdir /images
    # dd  if=/dev/zero  of=/images/initrd.img  bs=1k  count=4096 
  2. 在Ramdisk上建立4M的ext2類型的文件系統;
    # mke2fs  -m0  -F  /images/initrd.img  4096
    也可以是:# mke2fs  -F  -v  -m0  /images/initrd.im
    若要建立ext3類型的filesystem,命令是:
    # mke2fs  -j  -m0  -F  /images/initrd.img  4096 ,同樣,也可以不指定大小) 
  3. 在/mnt下建立目錄rootfs, 將已經格式化為ext2類型文件系統的ramdisk掛載至目錄/mnt/rootfs上;
    # mkdir –p /mnt/rootfs
    # mount  –o  loop  /images/initrd.img  /mnt/rootfs 
  4. 將宿主機上/myramdisk目錄下的文件結構拷貝至/mnt/rootfs目錄中(這就相當於拷貝至文件initrd.img中了);
    # cp  -av  /myramdisk/*  /mnt/rootfs
    NOTE:必須用命令拷貝的方式,否則可能出錯) 
  5. 卸載掉/mnt/rootfs;
    # umount  /mnt/rootfs 
  6. 產生一個壓縮的映象文件。
    # gzip  -9  < images/initrd.img >  images/initrd.bin 
  7. 最後,用mkimage工具將其製作成U-Boot的可執行ramdisk映像
    # ./mkimage -n 'RAM disk' -A arm -O linux -T ramdisk -C gzip -d initrd.bin initrd.boot
    也可以是:
    # ./mkimage –A arm –O linux –T ramdisk –C gzip –a 0x30800000 –e 0x30800000 –n  ‘ramdisk’  –d  initrd.bin  initrd.boot

 ………………………………………………………………………………………………………………………………

韓海鋒   email:hanhf@163.com  MSN:springmagus@hotmail.com  QQ:34196145




[admin via 研發互助社區 ] 基於s3c2410的ARMer9開發平台的使用已經有1734次圍觀

http://cocdig.com/docs/show-post-42245.html