2012年10月29日 星期一

如何使用 Xcircuit


1. 放大/縮小:Z/z
2. 增加格點間隔:Shift + =
   減少格點間隔:-
3. 畫線工具:
   滑鼠左鍵:增加轉折點
   滑鼠右鍵:刪除轉折點
   滑鼠中鍵:結束目前所畫線段(確定目前所畫線段)
4. 點選元件:
   方法一、在沒有畫圖的情況下將滑鼠遊標移至要點選的圖案上,再按滑鼠中鍵
   方法二、在沒有畫圖的情況下將按滑鼠中鍵拖曳出一個方框,方框中的元件皆
           會被選取
5. 複製元件:
   先點選元件,再按 c 複製元件,接著按滑鼠左鍵貼上元件(蓋印章),
   若按滑鼠中鍵則只貼上一次,滑鼠右鍵取消目前行動。

6. 刪除元件:
   先點選元件,再按 Del 鍵即可將被點選之元件刪除。

7. 移動元件:
   先點選元件,再按滑鼠左鍵拖曳即可移動元件。

8. 再次編輯元件:
   先點選元件,再按 e 即可再次編輯元件

9. 移動畫面:
   上/下/左/右鍵可以移動畫面

10. 置中畫面:
   將滑鼠移到要置中的地方,然後按 p

11. 畫連接點(鼻屎)
   方法一、從元件庫裡點選
   方法二、按英文句點

2012年10月19日 星期五

uEnv.txt

請參考 Das U-boot 之 manual
http://www.denx.de/wiki/DULG/UBootCmdGroupEnvironment

baudrate=115200
beaglerev=C4
optargs="consoleblank=0"
bootargs=console=ttyO2,115200n8 mpurate=auto buddy=none camera=none vram=12M omapfb.mode=dvi:640x480MR-16@60 omapdss.def_disp=dvi root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
bootcmd=if mmc rescan ${mmcdev}; then if run userbutton; then setenv bootenv uEnv.txt;else setenv bootenv user.txt;fi;echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loaduimage; then run mmcboot;fi;fi;run nandboot;
bootdelay=3
bootenv=uEnv.txt
bootfile=uImage.beagle
buddy=none
camera=none
console=ttyO2,115200n8
defaultdisplay=dvi
dieid#=51454d5551454d555400000051454d55
dvimode=640x480MR-16@60
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
loadaddr=0x80200000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadramdisk=fatload mmc ${mmcdev} ${rdaddr} ramdisk.gz
loaduimage=fatload mmc ${mmcdev}:1 ${loadaddr} /uImage
loaduimagefat=fatload mmc ${mmcdev} ${loadaddr} uImage
mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
mmcdev=0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext3 rootwait
mpurate=auto
nandargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${nandroot} rootfstype=${nandrootfstype}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs
ramargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${ramroot} rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr}
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=0x81000000,64M
ramrootfstype=ext2
rdaddr=0x81000000
usbtty=cdc_acm
userbutton=if gpio input 173; then run userbutton_xm; else run userbutton_nonxm; fi;
userbutton_nonxm=gpio input 7;
userbutton_xm=gpio input 4;
vram=12M

如何自行建立 rootfs (舊版, 2014)

如何自行建立 rootfs

0. 請確定你已經有使用 qemu arm 版建立起來的 arm.img

1. 備份 arm.img -> arm2.img

   cp arm.img arm2.img

2. 將 arm.img 掛載至 /mnt 目錄,請先確定兩個魔術數字:2048 512

   mount -o loop,offset=`expr 2048 \* 512` arm.img /mnt -t ext3
                                                                                        ext4

此時 /mnt 目錄下的檔案即為我們要截取的 rootfs,但是我們要先修改一下。


3. 清除檔案:

a. /mnt/lib/modules/* -> 此目錄中為舊版 Linux 核心模組,我們已自行編譯
   linux-3.4.X 核心,因此我們應該清掉舊版核心模組,改放新版核心模組。

b. /mnt/boot -> 舊版 Linux 核心,我們可以清掉。

c. /mnt/dev/.udev -> 清除不必要的 udev 檔案


4. 設定檔案:

a. /mnt/lib/modules/ -> 放回 linux-3.4.X 之模組檔案。

  cp -a DIR/modules/lib/modules/* /mnt/lib/modules
        ^^^^^^^^^^^^^^^^^^^^^^^^^
b. /mnt/etc/fstab 請改成以下內容:

/dev/mmcblk0p2   /       ext3   errors=remount-ro   0   1
/dev/mmcblk0p1   /boot vfat   defaults                  0   0

c. 接著請編輯 /mnt/etc/inittab 檔案,修改最後一行成為底下內容:

T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102

d. 檢查 /mnt/etc/network/interfaces 檔案,看其內容是否如下:

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

5. 將 rootfs 截取成為 rootfs.tar.xz 以便 deploy (部屬至虛擬 sdcard.img)

/mnt# tar cfva /root/rootfs.tar.xz .

 6. 解除掛載 arm.img

當我們將 rootfs 截取出來後,/mnt 目錄即不再需要使用,此時可以解除掛載,請執行
底下指令:

umount /mnt


7. 將 sdcard.img 掛載至 /mnt/sdcard1 /mnt/sdcard2 目錄

8. 複製 bootloader、Linux 核心及 uEnv.txt 至 /mnt/sdcard1,其檔案如下:

-rwxr-xr-x 1 root root   45444 2012-10-08 00:28 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-08 00:29 u-boot
-rwxr-xr-x 1 root root  344872 2012-10-08 00:29 u-boot.bin
-rwxr-xr-x 1 root root  344936 2012-10-08 00:29 u-boot.img
-rwxr-xr-x 1 root root    2400 2012-10-08 00:29 uEnv.txt
-rwxr-xr-x 1 root root 2475288 2012-10-08 00:29 uImage

9. 將 rootfs.tar.xz deploy 至 /mnt/sdcard2 目錄

tar xfva rootfs.tar.xz -C /mnt/sdcard2


10. 將 sdcard.img 解除掛載


11. 執行 qemu
qemu-system-arm -M beagle -m 512 -sd ./sdcard.img -clock unix -serial stdio \
        -device usb-mouse -device usb-kbd


如何確保開機正常!!

1. 核心編譯時要加入正確參數,特別是:
   ext2 ext3 ext4 vfat 均要加入編譯選項,而且要為 <*>
   <M> -> 模組,核心載入後才有作用
   <*> -> 內建至核心中,無需載入即有作用


2. uEnv.txt 中的 uenvcmd 要設定正確,特別是要加上
   run mmcargs;fatload mmc 0:1 0x8000000 uImage; bootm 0x8000000

3. 將新編之核心、uEnv.txt、MLO、u-boot.* 等檔案放入 sdcard 的第一個分割區
   將修改過之 rootfs 放入 sdcard 的第二個分割區

4. 第一個分割區一定要設定 boot 旗標


2012年10月17日 星期三

如何建立虛擬 SD card

#2020/04/20 改版

如何建立虛擬 SD card


0. 目標:建立一個 sdcard.img,將其分割為二個分割區

part1: 80 M
part2: 920 M

並將第一個分割區以 vfat 方式格式化,第二個分割區以 ext4 方式格式化,而且兩個分割區都要能掛載。


1. 使用 dd 指令建立 1G 之 sdcard.img

dd if=/dev/zero of=sdcard.img bs=1M count=1024

作完後之輸出如下所示:

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.8515 s, 60.1 MB/s

我們可以使用 file 及 hexdump 這兩個指令來檢視 sdcard.img,其操作如下:

file sdcard.img

其輸出為:

sdcard.img: data

hexdump sdcard.img

其輸出為:

0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
40000000

以上輸出表示此檔案之內容為 00 (也就是 ASCII 表中之 Null 字元),其位址從 0x0000000 一直至 0x40000000 也就是 1G。

到此為止,我們已完成一個空的 sdcard.img。接著我們要使用 losetup 來連接此檔案至 /dev/loop0 裝置以便進行分割及格式化。

2. 使用 losetup 指令

要使用 losetup 指令,請先切換至 root 權限,我們先看目前是否有 /dev/loop 裝置,其指令如下所示:

# losetup -a

理論上目前沒有任何輸出。接著請執行底下指令將 /dev/loop0 與 sdcard.img 「連接」在一起。

# losetup /dev/loop0 sdcard.img

此時我們即將 sdcard.img 「連接」至 /dev/loop0 這個裝置。


3. 使用 fdisk 分割 /dev/loop0

將第一個分割區切成 80 MB
將第二個分割區切成剩下空間 (920 MB)

作完後將分割區狀況存入並退出 fdisk,我們可以執行底下指令來觀看 /dev/loop0 狀態。

fdisk -lu /dev/loop0

其輸出如下所示:

# fdisk -lu /dev/loop0
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa5e072a5

Device       Boot  Start     End Sectors  Size Id Type
/dev/loop0p1        2048  165887  163840   80M  b W95 FAT32
/dev/loop0p2      165888 2097151 1931264  943M 83 Linux


在存分割表 (w 指令)時如果出現底下訊息要將 /dev/loop0 與 sdcard.img 分離,再重新連接才可以繼續往下作。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 22: 不適用的引數.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.


** 使用 losetup 將 /dev/loop0 與 sdcard.img 分離 **

# losetup -d /dev/loop0

我們可以執行 losetup -a 來看是否已解除連接。若要重新連接請執行以下指令:

# losetup /dev/loop0 sdcard.img

連接完可以執行

fdisk -lu /dev/loop0

來觀察其輸出是否如上所示。

4. 格式化/掛載/解掛/解除連結

4.1 格式化與掛載

我們統一將第 1 個分割區格式化為 fat 格式,第 2 個分割區格式化為 ext4 格式以便 u-boot 載入系統核心並掛載 rootfs。在格式化前我們需注意每一個分割區的 sector 數目,例如第 1 個分割區的 Sectors 為 163840,而第 2 個分割區則為 1931264。這兩個數字將分別應用在格式化上,但是在格式化前,我們要將第 1 個分割區連接至 /dev/loop1,第 2 個分割區連接至 /dev/loop2,請執行底下指令連接 /dev/loop1:

losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0

接著再執行底下指令連接 /dev/loop2:

losetup -o `expr 165888 \* 512` /dev/loop2 /dev/loop0

上述指令都有使用到 expr 這個命令,expr 可以拿來作簡單的四則運算,例如:

expr 1 + 1 其輸出為 2
expr 2 - 1 其輸出為 1

但若要進行乘法的話必須使用 \* 而非 *,因為 * 是特殊字元。

expr 2 * 3 -> expr: 格式錯誤
expr 2 \* 3 -> 6

至於除法範例如下:

expr 6 / 2 -> 2
expr 6 / 4 -> 1 (沒有餘數)

`expr a \* b` 表示「傳回」 a * b 之值。

當我們要連接 /dev/loop1 (第 1 個分割區) 及 /dev/loop2 (第 2 個分割區)時,必須跳過相對應的 offset,這個 offset 就由 expr 來替我們作運算。當 /dev/loop1 及 /dev/loop2 都連接上時,我們可以執行:

losetup -a

此時會出現底下輸出,告訴我們 /dev/loop1 及 /dev/loop2 都完成連接。

/dev/loop0: [0805]:2540233 (/home/herman/qemu_image/arm/sdcard.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 32256
/dev/loop2: [0005]:1312 (/dev/loop0), offset 90478080

接著我們即可真正對 /dev/loop1 及 /dev/loop2 進行格式化:

mkfs.msdos -s 2 /dev/loop1 81920

mkfs.ext4 /dev/loop2 965632    -> 此指令不用,以免 u-boot 無法掛載

mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2  -> 改用這個指令來分割虛擬 sdcard

格式化完畢後我們可以進行掛載以便待會複製檔案,我們統一掛載至

/mnt/sdcard1 及 /mnt/sdcard2 目錄。

Q: 若以上兩個目錄不存在,該如何建立 ?

mkdir -p /mnt/sdcard1 /mnt/sdcard2


建好目錄後可以進行掛載,指令如下:

mount /dev/loop1 /mnt/sdcard1
mount /dev/loop2 /mnt/sdcard2

我們可以執行 df -h 來檢查是否有正確掛載,其輸出如下:

檔案系統              Size  Used Avail Use% 掛載點
/dev/loop1             87M     0   87M   0% /mnt/sdcard1
/dev/loop2            919M   18M  855M   2% /mnt/sdcard2

接下來,我們可以針對虛擬 SDCARD 開始複製檔案以便使用 Qemu 開機模擬。

4.2 解掛

4.2.1 解掛目錄

# umount /mnt/sdcard1 /mnt/sdcard2

4.2.2 解掛 loop,注意:順序要跟掛 loop 反過來作。

# losetup -d /dev/loop2
# losetup -d /dev/loop1
# losetup -d /dev/loop0

檢查是否完全解開:

# losetup -a


5. 植入 bootloader、kernel 以及 rootfs

5.1 bootloader 所需檔案

MLO
u-boot
u-boot.bin
u-boot.img
uEnv.txt        -> 開機設定檔

5.2 kernel 所需檔案

uImage

請將上述檔案複製至 /mnt/sdcard1 目錄


5.3 如何建立 rootfs

Q: 請問什麼是 rootfs ?
a. 最簡單的作法:將 qemu 中的 rootfs 拿來改,但是要記得瘦身。

b. 另一個簡單的作法:拿現成的來用,網路上有一位高手叫 Robert Nelson,
他所提供的下載網址在:


http://rcn-ee.net/deb/minfs/

目前最新的下載檔案是:

http://rcn-ee.net/deb/minfs/wheezy/debian-7.7-minimal-armel-2014-11-10.tar.xz
c. 修改 rootfs

要將 rootfs 植入 /mnt/sdcard2 中請完成底下工作:

c.1 將 rootfs 存入 /mnt/sdcard2
c.2 將核心模組存入 /mnt/sdcard2/lib/modules 目錄
c.3 修改設定檔,修改內容如下:

c.3.a 將 /etc/inittab 存入 /mnt/sdcard2/etc 中,並將最後一行改為
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102

c.3.b 將 /mnt/sdcard2/etc/fstab 修改如下:
proc             /proc proc defaults           0 0
/dev/mmcblk0p2   /     auto errors=remount-ro  0 1
/dev/mmcblk0p1   /boot auto defaults           0 0

c.3.c 將 /mnt/sdcard2/etc/network/interfaces 修改如下:
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

c.3.d 將 /etc/sdcard2/etc/hostname 修改如下:
leenix

c.3.e 將 /etc/resolv.conf 修改如下:
nameserver 8.8.8.8

6. 當所有檔案完成複製後,我們必須將 sdcard.img 解除掛載及解除連接,請執行以下指令:

umount /mnt/sdcard1 /mnt/sdcard2 -> 先解除目錄掛載

losetup -d /dev/loop2   -> 再依順序解除 loop 連接,請依後進先出的原則來解除
losetup -d /dev/loop1
losetup -d /dev/loop0   -> 至此全部解除連接,我們可以執行

losetup -a 來確認。


7. 測試虛擬 sdcard.img

當我們都完成檔案複製後,我們可以使用 qemu 來測試所完成之虛擬 sdcard.img,測試指令如下:

 qemu-system-arm -M beagle -m 512 -nographic -sd ./test.img -clock unix \
        -device usb-mouse -device usb-kbd \
        -usb -device usb-net,netdev=mynet -netdev user,id=mynet

2012年10月7日 星期日

在 Linux 底下玩遊戲

在 Linux 底下玩遊戲

mame -> 大型電玩模擬器



1. 下載模擬器

apt-get install xmame-sdl

2. 下載遊戲檔

http://boneash.oldgame.tw/MAME/mame.html

3. 執行

/usr/games/xmame.SDL -rp . twincobr.zip

使用 ntpdate 來更新時間

 使用 ntpdate 來更新時間

1. 安裝 ntpdate 套件
apt-get install ntpdate

2. 在 /etc/default/ntpdate 中觀察結果,可選擇要不要加入台灣的伺服器
http://www.stdtime.gov.tw/Time/ntp/NTPClockOperatingManualRelease1.21.html

3. 以 root 權限執行底下指令更新系統時間(請注意網路連線必須沒有問題才行)
 ntpdate time.stdtime.gov.tw

架設 ssh 伺服器


架設 ssh 伺服器

Linux 是多人多工的作業系統,因此可以同時容納多人在同一台主機裡進行操作,要讓使用者能遠端連線進入我們的主機,我們必須架設 ssh 伺服器。

請執行

apt-get install openssh-server

來安裝 ssh 伺服器。當我們已經在 163.26.xx.xx 裝好 ssh 伺服器,該主機即可遠端連線,連線指令如下:

ssh -l 使用者帳號 163.26.xx.xx

不管是正常連線或是錯誤連線,我們都可以在 /var/log/auth.log 看到連線結果。

例如:

May  8 17:56:44 pc-6 sshd[1639]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.125.243.59  user=root

May  8 17:56:44 pc-6 sshd[1639]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.125.243.59  user=root
May  8 17:56:46 pc-6 sshd[1639]: Failed password for root from 118.125.243.59 port 17448 ssh2

上面錯誤訊息為:

1. 有個人從 118.125.243.59 連到我的機器
2. 他用 root 的帳號,但是沒有正確密碼
3. 入侵時間為 5/8 下午 5:56:44

要避免我們的機器被玩,我們要設定自動偵測錯誤連線並加入阻擋 IP 之機制,因此要安裝以下套件:

denyhosts
openssh-blacklist
openssh-blacklist-extra

在 /etc/hosts.deny 檔案中記錄我們那些主機要擋下來,這是正面表列。我們可以使用

nslookup IP 來查 IP 之 domain name


小結:

ssh 登錄是一個相當重要的程式,它可以讓遠端使用者連至我們所架設的伺服器來進行操作,一旦我們主機的帳號/密碼外露,有可能讓惡意使用者自全世界連線至我們的電腦。使用 denyhosts 套件可以有效降低惡意試帳/密的情況出現,並將惡意連線之 IP 登錄在 /etc/hosts.deny 檔案,如此一來此 IP 將無法再進行連線。


** 聽 MP3 **

1. 安裝音效驅動程式 - alsa
2. 安裝混音程式
3. 安裝 mp3 播放程式
4. 聽 mp3

2012年10月5日 星期五

編譯 ARM Linux 核心

編譯 ARM Linux 核心


檔案位置:
~/qemu_image/                   -> 所有虛擬 ARM 檔案目錄
        /kernel/                      -> 編譯 ARM Linux 核心目錄
                   /modules         -> 編譯 ARM Linux 核心模組目錄


0. 判別我們所要使用之 ARM CPU

我們的模擬目標為 Beagle Board,其 CPU 為 OMAP 3530,有關 Beagle Board 的詳細規格可以參考官方網站 (http://beagleboard.org/),而 OMAP 3530 是由德洲儀洲所生產之 ARM CPU,其資料可以參考德儀網站 (http://www.ti.com/product/omap3530?247SEM)。

OMAP 3530 是一顆 Cortex A8 的 ARM CPU,目前已被 Qemu ARM 完整支援,我們可以使用

qemu-system-arm -cpu ?

來觀看 Qemu ARM 版所支援之 CPU 清單,如下所示:

Available CPUs:
  arm1026
  arm1136
  arm1136-r2
  arm1176
  arm11mpcore
  arm926
  arm946
  cortex-a15
  cortex-a8
  cortex-a9
  cortex-m3
  pxa250
  pxa255
  pxa260
  pxa261
  pxa262
  pxa270
  pxa270-a0
  pxa270-a1
  pxa270-b0
  pxa270-b1
  pxa270-c0
  pxa270-c5
  sa1100
  sa1110
  ti925t
  any

因此我們可以使用 Qemu 來模擬 beagle board 平台,底下將介紹如何編譯 Linux 核心:

1. 下載 & 解壓縮

請切換至 ~/qemu_image/kernel 目錄,進行底下操作:

wget ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v3.x/linux-3.2.30.tar.xz

tar xfva linux-3.2.30.tar.xz

此時會出現 linux-3.2.30 目錄

2. 設定編譯參數

cd linux-3.2.30

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- omap2plus_defconfig

** ARM 版之核心設定參數檔在 linux-3.2.30/arch/arm/configs 目錄 **

此時會出現以下訊息:

  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

這表示我們已經完成基本參數設定,接著我們要作細部微調。請執行:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig

如果出現底下錯誤的話,表示我們還沒有安裝 libncurses5-dev 這個函式庫:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig

 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 ***
 *** Install ncurses (ncurses-devel) and try again.
 ***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2

請以底下指令安裝 libncurses5-dev 函式庫:

apt-get install libncurses5-dev


然後再重新執行底下指令即可:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig


請設定以下部份:

General setup  ---> Kernel compression mode (Gzip)  --->XZ

System Type  ---> TI OMAP2/3/4 Specific Features  --->
[*] OMAP3 BEAGLE board
[*] DEVKIT8000 board

File systems --->
<*> The Extended 4 (ext4) filesystem

設定完畢後請跳出 Linux 設定畫面,如此一來我們即完成 Linux 核心設定。

3. 編譯核心及核心模組

a. 編譯核心

time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage -j 4

假設在編譯時有底下訊息:

make: arm-linux-gnueabi-gcc: Command not found
scripts/kconfig/conf --silentoldconfig Kconfig
make: arm-linux-gnueabi-gcc: Command not found
  WRAP    arch/arm/include/generated/asm/auxvec.h
  WRAP    arch/arm/include/generated/asm/bitsperlong.h
  WRAP    arch/arm/include/generated/asm/cputime.h
  WRAP    arch/arm/include/generated/asm/emergency-restart.h
  WRAP    arch/arm/include/generated/asm/errno.h
  WRAP    arch/arm/include/generated/asm/ioctl.h
  WRAP    arch/arm/include/generated/asm/irq_regs.h
  WRAP    arch/arm/include/generated/asm/kdebug.h
  WRAP    arch/arm/include/generated/asm/local.h
  WRAP    arch/arm/include/generated/asm/local64.h
  WRAP    arch/arm/include/generated/asm/percpu.h
  WRAP    arch/arm/include/generated/asm/poll.h
  WRAP    arch/arm/include/generated/asm/resource.h
  WRAP    arch/arm/include/generated/asm/sections.h
  WRAP    arch/arm/include/generated/asm/siginfo.h
  WRAP    arch/arm/include/generated/asm/sizes.h
  CHK     include/linux/version.h
  UPD     include/linux/version.h
  HOSTCC  scripts/dtc/checks.o
  HOSTCC  scripts/dtc/data.o
  SHIPPED scripts/dtc/dtc-lexer.lex.c
  SHIPPED scripts/dtc/dtc-parser.tab.h
  SHIPPED scripts/dtc/dtc-parser.tab.c
  HOSTCC  scripts/dtc/dtc.o
  HOSTCC  scripts/dtc/flattree.o
  CHK     include/generated/utsrelease.h
  UPD     include/generated/utsrelease.h
  Generating include/generated/mach-types.h
  CC      kernel/bounds.s
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[1]: *** [kernel/bounds.s] Error 127
make: *** [prepare0] Error 2
make: *** Waiting for unfinished jobs....

  HOSTCC  scripts/dtc/fstree.o
  HOSTCC  scripts/dtc/livetree.o
  HOSTCC  scripts/genksyms/genksyms.o
  HOSTCC  scripts/dtc/srcpos.o
  HOSTCC  scripts/dtc/treesource.o
  SHIPPED scripts/genksyms/lex.lex.c
  SHIPPED scripts/genksyms/keywords.hash.c
  SHIPPED scripts/genksyms/parse.tab.h
  SHIPPED scripts/genksyms/parse.tab.c
  HOSTCC  scripts/genksyms/lex.lex.o
  HOSTCC  scripts/dtc/util.o
  HOSTCC  scripts/dtc/dtc-lexer.lex.o
  HOSTCC  scripts/dtc/dtc-parser.tab.o
  HOSTCC  scripts/genksyms/parse.tab.o
  HOSTLD  scripts/dtc/dtc
  CC      scripts/mod/empty.o
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[2]: *** [scripts/mod/empty.o] Error 127
make[1]: *** [scripts/mod] Error 2
make[1]: *** Waiting for unfinished jobs....

  HOSTLD  scripts/genksyms/genksyms
make: *** [scripts] Error 2
real    0m3.743s
user    0m4.576s
sys    0m0.304s

上面錯誤訊息是因為 arm-linux-gnueabi-gcc 這個指令找不到,我們可以切換至 /usr/bin 目錄來觀察 gcc cpp g++ 三個指令,如下所示:



root@debian:/usr/src# cd /usr/bin
root@debian:/usr/bin# ls -l arm-linux-gnueabi-gcc-4.7 arm-linux-gnueabi-cpp-4.7 arm-linux-gnueabi-g++-4.7
-rwxr-xr-x 1 root root 559672 10月 12  2012 arm-linux-gnueabi-cpp-4.7
-rwxr-xr-x 1 root root 562936 10月 12  2012 arm-linux-gnueabi-g++-4.7
-rwxr-xr-x 1 root root 558840 10月 12  2012 arm-linux-gnueabi-gcc-4.7



這個錯誤是因為編譯指令要的是 arm-linux-gnueabi-gcc、arm-linux-gnueabi-cpp 以及 arm-linux-gnueabi-g++ 三個檔案,而目前系統沒有,因此我們要手動建立連結:

root@debian:/usr/bin# ln -s arm-linux-gnueabi-cpp-4.7 arm-linux-gnueabi-cpp
root@debian:/usr/bin# ln -s arm-linux-gnueabi-g++-4.7 arm-linux-gnueabi-g++
root@debian:/usr/bin# ln -s arm-linux-gnueabi-gcc-4.7 arm-linux-gnueabi-gcc

接著再執行剛剛沒有成功的指令來編譯核心:

time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage -j 4

若是編譯過程中出現底下錯誤:

  SHIPPED arch/arm/boot/compressed/ashldi3.S
  AS      arch/arm/boot/compressed/lib1funcs.o
  AS      arch/arm/boot/compressed/ashldi3.o
  AS      arch/arm/boot/compressed/piggy.xzkern.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  UIMAGE  arch/arm/boot/uImage
"mkimage" command not found - U-Boot images will not be built
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2


這表示編譯程式找不到 mkimage 這個指令,我們可以上 packages.debian.org 來查詢,得知此檔案在 u-boot-tools 套件中,因此要再安裝 u-boot-tools 套件,然後再下編譯指令。編譯完畢後會出現以下訊息,告訴我們 uImage 已經編譯完成。

Image Name:   Linux-3.2.30
Created:      Fri Oct  5 15:43:49 2012
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2475104 Bytes = 2417.09 kB = 2.36 MB
Load Address: 0x80008000
Entry Point:  0x80008000
  Image arch/arm/boot/uImage is ready

我們可以執行底下指令來看  /arch/arm/boot/uImage 的屬性:

file arch/arm/boot/uImage

其輸出如底下所示:

file uImage
uImage: u-boot legacy uImage, Linux-3.2.30, Linux/ARM, OS Kernel Image (Not compressed), 2475104 bytes, Fri Oct  5 15:43:49 2012, Load Address: 0x80008000, Entry Point: 0x80008000, Header CRC: 0x3A120CB2, Data CRC: 0x1508ED43

b. 編譯核心模組

核心要正常工作必須要有相對應的核心模組,否則無法載入驅動程式,

# Compile Kernel Modules
time make -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules -j $CPU_CORE

# Install Kernel Modules
time make -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install INSTALL_MOD_PATH=../modules/ -j $CPU_CORE

cd ../modules
time tar cfa ../modules-$KERNEL_VERSION.tar.xz lib

編譯完成後我們會有一個名為 modules-核心編號.tar.xz 的檔案,此檔案可以用來取代原始 rootfs 中 /lib/modules 目錄中舊版的驅動核心模組。因此我們必須將舊版驅動核心模組移除,再放入我們剛剛編完之驅動核心模組。

4. 準備虛擬 SD card -> 請看講義

5. 將 /dev/loop1 掛載至 /mnt/sdcard1 目錄

mount /dev/loop1 /mnt/sdcard1

將以下檔案複製至 /mnt/sdcard1 目錄:

-rwxr-xr-x 1 root root   45444 2012-10-05 16:52 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-05 16:52 u-boot
-rwxr-xr-x 1 root root  344872 2012-10-05 16:52 u-boot.bin
-rwxr-xr-x 1 root root  344936 2012-10-05 16:52 u-boot.img
-rwxr-xr-x 1 root root 2475168 2012-10-05 16:54 uImage

6.

qemu-system-arm -M beagle -m 256 -nographic -sd sdcard.img

此時即可看到 qemu 使用虛擬 sdcard 開機。


2012年10月3日 星期三

u boot 下載、編譯:


u boot 下載、編譯:

0 toolchain  安裝

/etc/apt/sources.list 請加入以下設定:
deb http://www.emdebian.org/debian/ squeeze main

接著執行

apt-get update

apt-get install gcc-4.4-arm-linux-gnueabi cpp-4.4-arm-linux-gnueabi g++-4.4-arm-linux-gnueabi

即可完成 toolchain 安裝。


1. U-boot 是使用在嵌入式系統的 bootloader,所謂的 bootloader 是指開機時載入
的一個小程式,在開機階段作好系統初始化並導入系統 (Linux) 核心,最後完成開機
流程將權限交給作業系統。

U-boot 的官方網頁如下:

http://www.denx.de/wiki/U-Boot

下載網址在:

ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2

下載完畢後會出現 u-boot-latest.tar.bz2 這個檔案,之後我們就可以準備解壓縮。

tar xfva u-boot-latest.tar.bz2

解開完畢後會出現 u-boot-2013.10 (最新版) 之目錄,請切換至此目錄準備編譯。

2. 編譯 u-boot

u-boot-2013.10 目錄底下有個 boards.cfg 檔案,裡面內建「所有」支援 ARM 開發板之設定,請看該檔內容,我們會看到其中有一行如下:

omap3_beagle                 arm         armv7       beagle              ti             omap3

以上資訊告訴我們 u-boot 有支援 beagle 板,請執行底下指令設定編譯參數。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- omap3_beagle_config

此時會出現底下訊息:

Configuring for omap3_beagle board...

接著請執行底下指令編譯:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all -j 8

編完之後會出現幾個檔案:

MLO
u-boot
u-boot.bin
u-boot.img

3. 測試
請執行底下指令將所開機必要檔案轉至 sd.img 這個檔案

cat MLO u-boot u-boot.bin u-boot.img > sd.img

接著執行:

qemu-system-arm -M beagle -nographic -sd sd.img

我們會看到 U-boot 2012.07 已經啟動,但是因為沒有核心所以無法開機並且會在此處
當掉,我們會在之後的教學中進行說明如何繼續往下作。

U-Boot SPL 2012.07 (Oct 04 2012 - 11:43:34)
Texas Instruments Revision detection unimplemented
OMAP SD/MMC: 0
mmc_init_stream: timedout waiting for cc!
spl: mmc init failed: err - -19
### ERROR ### Please RESET the board ###

請按 Ctrl+a x 跳出 Qemu

ARM Qemu 的使用:


ARM Qemu 的使用:

0. 看 Qemu 的 Help

qemu-system-arm -help

會跑出一堆 Qemu 的使用說明,請參考原廠手冊

http://wiki.qemu.org/Manual

1. 看 Qemu 的版本

qemu-system-arm -version

QEMU emulator version 0.14.1, Copyright (c) 2003-2008 Fabrice Bellard

2. 看 Qemu 所支援的 ARM 平台

qemu-system-arm -M ?

Supported machines are:
z2                   Zipit Z2 (PXA27x)
xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
vexpress-a9          ARM Versatile Express for Cortex-A9
vexpress-a15         ARM Versatile Express for Cortex-A15
versatilepb          ARM Versatile/PB (ARM926EJ-S)
versatileab          ARM Versatile/AB (ARM926EJ-S)
tosa                 Tosa PDA (PXA255)
lm3s811evb           Stellaris LM3S811EVB
lm3s6965evb          Stellaris LM3S6965EVB
akita                Akita PDA (PXA270)
spitz                Spitz PDA (PXA270)
borzoi               Borzoi PDA (PXA270)
terrier              Terrier PDA (PXA270)
realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
overo                Gumstix Overo board (OMAP3530)
sx1                  Siemens SX1 (OMAP310) V2
sx1-v1               Siemens SX1 (OMAP310) V1
n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
n900                 Nokia N900 (OMAP3)
musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
mainstone            Mainstone II (PXA27x)
kzm                  ARM KZM Emulation Baseboard (ARM1136)
integratorcp         ARM Integrator/CP (ARM926EJ-S) (default)
highbank             Calxeda Highbank (ECX-1000)
connex               Gumstix Connex (PXA255)
verdex               Gumstix Verdex (PXA270)
nuri                 Samsung NURI board (Exynos4210)
smdkc210             Samsung SMDKC210 board (Exynos4210)
collie               Collie PDA (SA-1110)
beagle               Beagle board (OMAP3530)
beaglexm             Beagle board XM (OMAP3630)
none                 empty machine

但是官方版 qemu 沒有支援 beagle 平台,因此我們要自行安裝 qemu linaro 版。

其網址如下:

https://launchpad.net/qemu-linaro

而下載網址如下:
https://launchpad.net/qemu-linaro/trunk/2012.09/+download/qemu-linaro-1.2.0-2012.09.tar.gz

請下載此檔案,然後依據上次編譯流程來編譯 Qemu linaro 版,並安裝在自己主機上。

安裝完畢後請執行

qemu-system-arm -M ?

看有沒有支援 beagle 平台。