2013年12月9日 星期一

uboot 命令列操作簡介

%http://blog.csdn.net/ghostyu/article/details/6968681
%http://www.denx.de/wiki/view/DULG/Manual

目的:了解 uboot 的命令列操作方式

uboot 是一套廣泛使用在嵌入式系統上之 bootloader,要順利的使用 uboot,必須對其命令列操作方式有所了解,如此一來當 uboot 在開機時發生錯誤的話,才能夠自己一一針對故障進行排除。底下我們將針對 uboot 的指令作概略的說明:

help -> 呼叫可使用之指令,如底下所示:

?       - alias for 'help'
askenv  - get environment variables from stdin
base    - print or set address offset
bdinfo  - print Board Info structure
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
bootm   - boot application image from memory
bootp   - boot image via network using BOOTP/TFTP protocol
bootz   - boot Linux zImage image from memory
chpart  - change active partition
cmp     - memory compare
coninfo - print console devices and information
cp      - memory copy
crc32   - checksum calculation
dcache  - enable or disable data cache
dhcp    - boot image via network using DHCP/TFTP protocol
echo    - echo args to console
editenv - edit environment variable
env     - environment handling commands
exit    - exit script
ext2load- load binary file from a Ext2 filesystem
ext2ls  - list files in a directory (default /)
false   - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls   - list files in a directory (default /)
fdt     - flattened device tree utility commands
go      - start application at address 'addr'
gpio    - input/set/clear/toggle gpio pins
help    - print command description/usage
i2c     - I2C sub-system
icache  - enable or disable instruction cache
imxtract- extract a part of a multi-image
itest   - return true/false on integer compare
led     - [0|1|green|all] [on|off|toggle]
load    - load binary file from a filesystem
loadb   - load binary file over serial line (kermit mode)
loads   - load S-Record file over serial line
loadx   - load binary file over serial line (xmodem mode)
loady   - load binary file over serial line (ymodem mode)
loop    - infinite loop on address range
ls      - list files in a directory (default /)
md      - memory display
mm      - memory modify (auto-incrementing address)
mmc     - MMC sub system
mmcinfo - display MMC info
mtdparts- define flash/nand partitions
mw      - memory write (fill)
nand    - NAND sub-system
nandecc - switch OMAP3 NAND ECC calculation algorithm
nboot   - boot from NAND device
nfs     - boot image via network using NFS protocol
nm      - memory modify (constant address)
ping    - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv  - set environment variables
setexpr - set environment variable as the result of eval expression
showvar - print local hushshell variables
sleep   - delay execution for some time
source  - run script from memory
test    - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
true    - do nothing, successfully
usb     - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version

version(v) -> 顯示目前 u-boot 版本,如底下所示:

U-Boot 2013.10 (Nov 15 2013 - 09:58:56)
arm-linux-gnueabi-gcc (Debian 4.4.6-14) 4.4.6
GNU ld (GNU Binutils for Debian) 2.22

usb start -> 啟動 usb 功能,其畫面如下所示:

(Re)start USB...
USB0:   ULPI: ulpi_reset: failed writing reset bit
ULPI: ulpi_reset: failed writing reset bit
USB EHCI 0.00
scanning bus 0 for devices... 1 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
       scanning usb for ethernet devices... 0 Ethernet Device(s) found

usb info -> 觀看 usb 資訊,如底下所示:

1: Hub,  USB Revision 2.0
 - u-boot EHCI Host Controller
 - Class: Hub
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x0000  Product 0x0000 Version 1.0
   Configuration: 1
   - Interfaces: 1 Self Powered 0mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 1
     - Class Hub
     - Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms


bdinfo -> 顯示目前板子資訊,如底下所示:

arch_number = 0x0000060A
boot_params = 0x80000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x08000000
DRAM bank   = 0x00000001
-> start    = 0x88000000
-> size     = 0x08000000
eth0name    = usb_ether
ethaddr     = (not set)
current eth = usb_ether
ip_addr     = <NULL>
baudrate    = 115200 bps
TLB addr    = 0x8FFF0000
relocaddr   = 0x8FF59000
reloc off   = 0x0FE59000
irq_sp      = 0x8FEF8F30
sp start    = 0x8FEF8F20


mmcinfo -> 顯示目前記憶卡資訊,如底下所示:

Device: OMAP SD/MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU!
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 1 GiB
Bus Width: 4-bit

mmc -> 顯示記憶卡之相關操作指令,如下所示:

Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices


mmclist -> 顯示目前的記憶卡,如底下所示:

OMAP SD/MMC: 0

mmc rescan -> 重新掃瞄目前板子上有幾張記憶卡

mmc part -> 顯示目前記憶卡上之分割區,如底下所示:

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     2048            163840          bafb41f7-01     0b Boot
  2     165888          1931264         bafb41f7-02     83


此資訊可搭配之前分割之 sdcard.img 來比較,如下所示:

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *        2048      165887       81920    b  W95 FAT32
/dev/loop0p2          165888     2097151      965632   83  Linux



fatinfo -> 觀看 FAT filesystem 資訊,其語法如下:

fatinfo <interface> [<dev[:part]>]

其中的 interface 是指儲存介面,而 dev:part 則是指其裝置及分割區編號


我們可以執行底下指令來觀看 sdcard.img 的 #1 分割區:

fatinfo mmc 0:1

其輸出如下:

Interface:  MMC
  Device 0: Vendor: Man 0000aa Snr adbeef00 Rev: 13.14 Prod: QEMU!
            Type: Removable Hard Disk
            Capacity: 1024.0 MB = 1.0 GB (2097152 x 512)
Filesystem: FAT16 "           "

fatls -> 列出 FAT 分割區之內容,其語法如下:

fatls <interface> [<dev[:part]>] [directory]

因此我們可以執行底下指令來觀看 FAT 檔案系統中之檔案:

fatls mmc 0:1

其輸出如下所示:

  2539176   uimage
    47164   mlo
  1622640   u-boot
   346280   u-boot.img
   346216   u-boot.bin
  2539112   zimage

6 file(s), 0 dir(s)

fatloat -> 載入 FAT 檔案系統中之檔案,其語法如下:

fatload <interface> [<dev[:part]>]  <addr> <filename> [bytes [pos]]

現在,我們要將編好的 Linux 核心載入至 ARM 的初始記憶體位置,也就是

0x80000000,我們應該要下底下指令:

fatload mmc 0:1 0x80000000 uImage

其輸出如下所示:

reading uImage
2539176 bytes read in 325 ms (7.5 MiB/s)

這個訊息告訴我們,uboot 已載入 Linux 核心,其檔名為 uImage,根據我們所下的
指令,這個核心被載入至 0x80000000 的位置。

bootm -> 從某個記憶體位置開機,以我們的例子來說,其開機位置為 0x80000000。

因此我們可以下底下指令來開機:

bootm 0x80000000

2013年11月27日 星期三

dell streak 5 刷機筆記

dell streak 5 刷機筆記

1. 下載 ClockworkMod Recovery,下載網址如下:

   http://forum.xda-developers.com/wiki/Dell_Streak/ROMs#Recovery_Images

2. 在 Debian 64 位元系統安裝刷機工具:adb 及 fastboot。

3. 確定 adb 及 fastboot 能支援 dell streak 5:

3.1 先將 dell streak 5 的 USB Debugging 選項打開,位置是:
    Setup -> Development -> USB debugging。

3.2 將 dell streak 5 與主機連線,並執行 lsusb 觀看是否已與 dell streak 5 連線,
    其輸出如下:
    Bus 004 Device 023: ID 413c:b007 Dell Computer Corp.

3.3 將要刷入 dell streak 5 的 rom 存入 sd card 中,假設其名稱為 rom.zip

3.4 以 root 權限執行 adb devices,看看系統是否有抓到 dell streak 5:

# adb devices
List of devices attached

0011954001337828        device

如果有上述裝置表示 dell streak 5 已經可以被 adb 抓到。

3.5 將 Dell streak 5 重開進 fastboot 模式,可以執行底下指令:

    adb reboot bootloader

    或一直按 ”照相鍵" + "開機鍵” 一直到開機畫面,再選右上角之 fastboot

3.6 刷 ClockworkMod Recovery image,以此例來說其名稱為 S5-6.0.1.2.img,指令如下:
    fastboot -i 0x413c flash recovery S5-6.0.1.2.img

    刷完後可以執行 fastboot reboot 來重新開機

4. 重新開機時請按 "音量+" + "音量-" + "開機鍵" 一直到刷機選單,然後選擇:

   2. Software upgrade via Update.pkg on SD card

   再選擇

   choose zip from SD card

   選好之後選 Install 即可

   記得將所有原本手機上的資料清掉,因此底下操作要先作:
   wipe data/factory reset
   wipe cache partition

參考網站:

Dell Streak 刷機教學... (圖多)

{APK技術組}【精華版APK首發】Dell Streak Mini 5 "ROM刷包~穩定無Bug

How to Install ClockworkMod Recovery on the Dell Streak 5

【新手看了也會】開開心心吃薑餅....Dell Streak Mini 5 自升 Android 2.3.3

2013年11月25日 星期一

安裝 qemu linaro 版

目的:安裝 qemu linaro 版

說明:qemu linaro 版是第三方協力廠商所開發的 qemu 版,其功能較原始官方版本更強,例如支援 beagle 模擬,因此在此我們介紹如何下載、編譯、安裝 qemu linaro 版。

下載:qemu linaro 版下載網址如下:
      https://launchpad.net/qemu-linaro/

      請下載最新版本,以本例來說,其檔名是 qemu-linaro-1.7.0-2014.01.tar.gz

      wget ftp://120.117.72.71/files/qemu-linaro-1.7.0-2014.01.tar.gz

解開:tar xfva qemu-linaro-1.7.0-2014.01.tar.gz
      解開後會出現一個名為 qemu-linaro-1.7.0-2014.01 的目錄,請切換至此目錄中。


要編譯前要先安裝底下套件:

zlib1g-dev
pkg-config
libcurl4-openssl-dev
libsdl-dev
libsasl2-dev
libaio-dev
libvde-dev
libvdeplug2-dev
uuid-dev
libcap-ng-dev
libpixman-1-dev


編譯:

./configure


若是 ./configure 出現底下錯誤的話:

ERROR: DTC not present. Your options:
         (1) Preferred: Install the DTC devel package
         (2) Fetch the DTC submodule, using:
             git submodule update --init dtc

其解決方法在:

http://lists.gnu.org/archive/html/qemu-devel/2013-11/msg03494.html

請再安裝底下套件

device-tree-compiler
libfdt-dev


time make -j N

若有錯誤訊息,請設法解決。


安裝:

# make install


驗證:

在 /usr/local/bin 目錄下有一堆 qemu-system-???? 的檔案,如下所示:

/usr/local/bin/qemu-system-alpha         /usr/local/bin/qemu-system-or32
/usr/local/bin/qemu-system-arm           /usr/local/bin/qemu-system-ppc
/usr/local/bin/qemu-system-cris          /usr/local/bin/qemu-system-ppc64
/usr/local/bin/qemu-system-i386          /usr/local/bin/qemu-system-ppcemb
/usr/local/bin/qemu-system-lm32          /usr/local/bin/qemu-system-s390x
/usr/local/bin/qemu-system-m68k          /usr/local/bin/qemu-system-sh4
/usr/local/bin/qemu-system-microblaze    /usr/local/bin/qemu-system-sh4eb
/usr/local/bin/qemu-system-microblazeel  /usr/local/bin/qemu-system-sparc
/usr/local/bin/qemu-system-mips          /usr/local/bin/qemu-system-sparc64
/usr/local/bin/qemu-system-mips64        /usr/local/bin/qemu-system-unicore32
/usr/local/bin/qemu-system-mips64el      /usr/local/bin/qemu-system-x86_64
/usr/local/bin/qemu-system-mipsel        /usr/local/bin/qemu-system-xtensa
/usr/local/bin/qemu-system-moxie         /usr/local/bin/qemu-system-xtensaeb

我們可以執行

/usr/local/bin/qemu-system-arm -version

或是

/usr/local/bin/qemu-system-x86_64 --version


其輸出如下:


QEMU emulator version 1.7.0 (qemu-linaro 2014.01), Copyright (c) 2003-2008 Fabrice Bellard


我們可以看過上述字串有 qemu-linaro 2014.01,這表示我們所安裝的 qemu linaro 已經是最新版了。

降級 arm gcc toolchain 至 4.4 版

目的:降級 arm gcc toolchain 至 4.4 版

原因:gcc arm gnueabi 4.7 版在升級上有軟體相依性的問題,因此我們要降級成
      gcc 4.4 版

方式:

1. 將 ftp://120.117.72.71/toolchain/ 整個抓下來

wget -t 0 -np -m ftp://120.117.72.71/toolchain/

2. 至 toolchain 目錄中執行底下指令:

cd 120.117.72.71/toolchain

# dpkg -i *

來安裝 4.4 的 toolchain,作完後請到 /usr/bin 目錄下重新建立 soft link

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

2013年11月24日 星期日

如何新增 icewm 選單圖示

目的:如何新增 icewm 選單圖示

1. 圖示儲存路徑(目錄)

   /usr/share/pixmaps
   /usr/share/icons

2. 觀看圖片程式:geeqie
   編輯圖片程式:gimp


3. 下載圖片,要作圖示以正方形為宜,流程如下:
   3.1 以 gimp 編輯圖形,並切成正方形,
   3.2 匯出為 kerorohead.png

4. 以 geeqie 觀看剛剛所作之圖示

5. 加入 icewm 選單
   cd /etc/X11/icewm
   以 root 權限編輯 menu 這個檔案

   把圖示欄位寫成絕對路徑,如底下所示:

   prog "urxvt24" /home/eecs/kerorohead.png urxvt24


6. icewm 的系統設定檔 /etc/X11/icewm/preferences,其中有一行 IconPath,設定如
   底下所示:

IconPath="/usr/share/pixmaps:/usr/share/icons:/usr/share/icons/icewm_icons"

   如此一來即可使用

   /usr/share/pixmaps
   /usr/share/icons
   /usr/share/icons/icewm_icons

   這三個目錄來存放 icon (圖示)

7. 以 root 權限把編輯完的圖示存至圖示目錄

   # cp /home/eecs/kerorohead.png /usr/share/icons

   複製完畢後請以 ls -l /usr/share/icons 來檢視此目錄是否有 kerorohead.png

8. 接下來請在 /etc/X11/icewm/menu 中設定圖示,而且無需加上路徑。

2013年11月11日 星期一

使用 qemu 啟動虛擬 ARM 機器

0. 先以 qemu 安裝 ARM 版 Debian Linux 至 arm.img

檔案位置:

~/qemu_image/                   -> 所有虛擬 ARM 檔案目錄
            /arm.img            -> 虛擬 ARM 硬碟映像檔
            /vmlinuz-3.2.0-4-versatile          -> ARM 開機核心
            /initrd.img-3.2.0-4-versatile       -> ARM 開機 initrd
            /runarm.sh          -> 開機 script


0. 先執行底下指令:
# losetup -a
此時會看到目前沒有輸出。

1. 接著將開機核心擷取出來:

# losetup /dev/loop0 arm.img
再執行
# losetup -a
其輸出如下:
/dev/loop0: [0831]:31198060 (/home/herman/qemu_image/arm.img)
這表示 /dev/loop0 與 arm.img 已經連接 (attach) 在一起,之後我們可以使用 fdisk -lu /dev/loop0 來觀看是否為當初安裝時所分割的磁區:

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            2048     3913727     1955840   83  Linux
/dev/loop0p2         3915774     4192255      138241    5  Extended
/dev/loop0p5         3915776     4192255      138240   82  Linux swap / Solaris

開機核心位於 ?

/boot

因此,我們要將 /dev/loop0p1 掛載上來,再至其 boot 目錄擷取 ARM 版 Linux 核心及 initrd。

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

接著我們可以將 /dev/loop1 掛載至 /mnt 目錄下:

mount /dev/loop1 /mnt

掛載完後可以執行 df -h /mnt 來觀看結果:

檔案系統        容量  已用  可用 已用% 掛載點
/dev/loop1      1.9G  506M  1.3G   30% /mnt

接著可以至 /mnt/boot 目錄下擷取 Linux 核心

 cp /mnt/boot/initrd.img-3.2.0-4-versatile .
cp /mnt/boot/vmlinuz-3.2.0-4-versatile .

如此一來即完成核心擷取,接下來可以進行開機作業。

2. 使用 qemu 來開機

請將底下指令另存 runarm.sh 以便進行開機:

qemu-system-arm -M versatilepb -m 512 \
        -kernel ./vmlinuz-3.2.0-4-versatile \
        -initrd ./initrd.img-3.2.0-4-versatile \
        -hda arm.img \
        -append "root=/dev/sda1"


接著請執行 sh runarm.sh

 3. 登入系統,確定我們是在 ARM 的機器中

請在登入畫面使用 root 帳號、密碼,看能不能登入,並執行

cat /proc/cpuinfo

來觀看 CPU 狀態。


如果在 qemu 視窗中點擊滑鼠將會使 qemu 把滑鼠「抓走」,此時我們要按

Ctrl+Alt 讓 qemu 將滑鼠「釋放」出來,否則會沒有遊標可用,要確定目前

滑鼠是否有被 qemu 抓走請看 qemu 之狀態列。

在 qemu 畫面下按 Ctrl+Alt+f 可以放大/縮小全螢幕狀態。

 4. 安裝 arm 的 Xwindow,並進入 Xwindow 環境

4.1 將 /etc/apt/sources.list 中的鏡像站改至校內:

加上這兩行

deb ftp://120.117.72.71/debian wheezy main contrib non-free
deb ftp://120.117.72.71/debian wheezy-updates main contrib non-free

將 deb-src 註解,保留 security.debian.org 設定


修改完畢後執行 apt-get update

再安裝 xorg icewm 套件

4.2 安裝完畢後以一般 user 登入

登入完畢後執行

startx

看看能不能進入 Xwindow

5. 清除已安裝之 .deb 檔案

# apt-get clean

清除完畢可以執行 df -h 來看目前磁碟空間

6. 依照 X86 流程,安裝 iceweasel,並觀察能否上網。

2013年11月10日 星期日

啟動音效卡支援

目的:啟動音效卡支援

1. 使用 id 指令檢查自己是否有 audio 次群組

id

其輸出如下:

uid=1000(herman) gid=1000(herman) groups=1000(herman),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev)

若無 audio 次群組,請編輯 /etc/group 檔案,在 audio 行加上 eecs,如底下所示:

audio:x:29:eecs

改完要登出系統,再重新登入一次,並執行 id 指令確認是否有 audio 次群組。

2. 安裝 alsamixergui

apt-get install alsamixergui

3. 安裝播 mp3 程式 audacious

apt-get install audacious

4. 啟動 audacious 並下載 mp3 檔案進行測試

5. 安裝 flash player

請確定 /etc/apt/sources.list 中的設定有 non-free,如下所示:

 deb ftp://120.117.72.71/debian wheezy main contrib non-free

接著安裝 flashplugin-nonfree 套件,然後重開 firefox,再連上 youtube 等影音網站看看是否可以看到電影。

2013年10月28日 星期一

安裝 ARM toolchain (舊/2014版)

目的:安裝 ARM toolchain


Embedded Debian Linux 的官方網站在:http://www.emdebian.org/crosstools.html,要進行 Embedded Debian Linux 開發,首先我們要將 Embedded Linux 的套件庫新增至系統中。

1. 在 /etc/apt/sources.list 新增底下二行:

deb http://www.emdebian.org/debian/ squeeze main
deb http://opensource.nchc.org.tw/debian/ squeeze main contrib non-free

2. 更新套件狀態

apt-get update

此時我們會發現系統有底下警告訊息:

W: GPG error: http://www.emdebian.org wheezy Release: 由於無法取得它們的公鑰,以下簽章無法進行驗證: NO_PUBKEY B5B7720097BB3B58

我們可以安裝 emdebian-archive-keyring 套件來解決上面的警告訊息,指令如下:

apt-get install emdebian-archive-keyring

安裝完再執行 apt-get update 即無錯誤訊息。

3. 安裝 ARM ToolChain

請安裝底下套件:

gcc-4.4-arm-linux-gnueabi
cpp-4.4-arm-linux-gnueabi
g++-4.4-arm-linux-gnueabi

我們在安裝時會發現系統是由 http://www.emdebian.org 網站下載相關套件,而非 Debian Linux 鏡像站,裝完後的可執行檔名稱如下:

arm-linux-gnueabi-gcc-4.4
arm-linux-gnueabi-g++-4.4
arm-linux-gnueabi-cpp-4.4


4. 驗證 ARM ToolChain

如果我們使用一般 gcc 來觀看版本的話,指令如下:

gcc -v

其輸出為:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-5)

其中有一行

Target: x86_64-linux-gnu

告訴我們此 C 編譯器之目標為 x86_64 平台,現在我們執行 ARM gcc 來看其版本,指令如下:

arm-linux-gnueabi-gcc-4.7 -v

其輸出為:

Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc-4.7
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabi/4.7/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-4' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.7.2 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv4t --with-float=soft --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --with-headers=/usr/arm-linux-gnueabi/include --with-libs=/usr/arm-linux-gnueabi/lib
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-4)

我們可以由上面的 Target 這行看到其目標為 arm-linux-gnueabi


5. 實際編譯 C 程式

在此以 C 程式第一個範例 hello.c 作編譯測試,其原始碼如下:

void main(void)
{
  printf("Hello World\n");
}

我們先以 gcc 來編譯此程式,指令如下:

gcc hello.c -o hello

此時會產生一個 hello 的可執行檔,其屬性如下:

-rwxr-xr-x 1 herman herman 6751 10月 29 09:33 hello

我們可以使用 file hello 來觀看其檔案資訊,輸出如下:

hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xf29466ceaf1115e4b88f524d8432210a2a1ea1ca, not stripped

從上述資訊我們可以看到 hello 是 x86-64 的可執行檔,接下來我們以 ARM gcc 來編譯,指令如下:

arm-linux-gnueabi-gcc-4.7 hello.c -o hello_arm

此時會產生一個 hello_arm 的可執行檔,我們可以使用 file hello_arm 來觀看其檔案資訊,輸出如下:

hello_arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x8f91e5977bcd09b9b94028392cdd29560fb655ee, not stripped

從上述資訊我們可以看到 hello 是 ARM 的可執行檔。到這裡為止,我們已經初步完成 ARM ToolChain 安裝,接下來我們將使用此 Tool Chian 來編譯 ARM 版 Linux 核心以及 bootloader,並將系統植入先前完成之 sdcard.img 中,再以 qemu 來開機。

2013年10月24日 星期四

NGSPICE 的 .control 語法

.control

set hcopydevtype=postscript
set hcopypscolor=true

set color1=rgb:0/0/0
set color0=rgb:f/f/f
set hcopywidth=640
set hcopyheight=400


hardcopy file.eps v(2) v(1)


其中:
 
set color1=rgb:0/0/0
set color0=rgb:f/f/f

是將黑底白線,改為白底黑線。


 
set hcopywidth=640
set hcopyheight=400

是設定存檔圖片之寬為 640 點,高為 400 點。

2013年10月17日 星期四

XCircuit 使用方式

1. 安裝

apt-get install xcircuit

2. 啟動

xcircuit &


3. 使用

z -> 縮小顯示比例
Z -> 放大顯示比例

紅點是格點,可以按 + - 來改變格點間距。


4.
右側是工具圖示,底下是工具介紹

4.1 畫線

4.1 畫線

滑鼠左鍵是畫線、定義轉折點
滑鼠右鍵是取消轉折點、取消畫線
滑鼠中鍵是決定畫線

4.2 畫方塊


4.3 畫圓/橢圓

首先選擇畫圓圖示,此時遊標會變成圓形,接著在格點上點滑鼠左鍵,會出現一個圓。

此時再按滑鼠左鍵,會變成畫弧模式,我們可以選擇我們要的弧形,

再按左鍵可以選擇圓弧的起點,接著按左鍵可以選圓弧終點。

畫完弧形後再按左鍵可以調整圓形比例,如果要畫橢圓的話可以在此階段處理。

如果我們再按左鍵的話,可以繼續調整,假設已經畫完的話,

可以直接按滑鼠中鍵結束繪圖。

4.4 選擇圖形/取消選擇圖形

將滑鼠遊標移至某個圖形上,再按中鍵可以把該物件變成黃色,此時該物件即被選擇。

多重選擇作法 1 - 使用滑鼠中鍵一一選擇物件
多重選擇作法 2 - 使用滑鼠中鍵拉一個方框,裡面的物件都會被選取。

按滑鼠右鍵,可以取消選擇圖形

4.5 刪除圖形

先選擇圖形,再按 Del 即可刪除圖形。

4.6 還原上一步

如果作錯事的話,可以按 u 選原上一步。

4.7 叫出內建元件庫 (Library)

按 l 可以叫出元件庫,再按 l 可以切換元件庫



4.8 將元件顯示移至畫面正中央

先將滑鼠遊標對準元件,再按 p 即可將該元件顯示移至畫面正中央。

4.9 移動元件

先以中鍵選擇要移動的元件,再按左鍵抓取該物件,然後移動該物件。


4.10 複製元件

將遊標移至要複製的元件,然後按 c 即可複製,此時移動滑鼠,我們可以看到分身元件。

請在要放置的位置上按滑鼠中鍵即可貼上,若按左鍵的話會蓋印章。

4.11 旋轉元件

要旋轉元件,請先選擇要旋轉之元件,再按右側工具圖示,或是

Edit -> Rotate/Flip 選擇來旋轉元件


4.12 加線的連接點/跳線

請按 l 進入元件,再選擇連接點或跳線。

連接點也可以按 . 直接打上去。


4.13 打字

請在畫面按 t 即可輸入字元

按 shift + t 可以幫線/端點標名字

標端點有個至高無上的指導原則:不要壓到線 + 在端點旁邊


4.14 上色

先選擇要上色的元件 (線、元件、字),再點右側顏色圖示來選顏色。

請注意,所有元件的顏色要一致,所有線段的顏色要一致,所有端點的顏色要一致。


4.15 編輯已存在之元件

請選擇要編輯的元件,再按 e 即可再編輯此元件。

4.16 切換多檔編輯

按 1 2 3 4 5 6 7 8 9 0

可以切換至不同頁面,編輯不同檔案。

2013年10月14日 星期一

Qemu ARM 虛擬機器安裝

1. 安裝 qemu

apt-get install qemu

2. 建立 ~/qemu_image 目錄

~$ mkdir qemu_image

3. 切換至 ~/qemu_image 目錄

cd ~/qemu_image

4. 建立 qemu-image 檔

qemu-img create arm.img 2G

5. 啟動 ARM Debian Linux 安裝畫面

5.1 下載 Debian ARM 安裝光碟至 ~/qemu_image 目錄中

ftp://ftp.twaren.net/Linux/Debian/debian-cd/7.6.0/armel/iso-cd/debian-7.6.0-armel-CD-1.iso

5.2 下載 Debian ARM 安裝開機檔至 ~/qemu_image/install 目錄中

將底下的兩個檔案複製到 ~/qemu_image/install 目錄中


ftp://ftp.debian.org/debian/dists/wheezy/main/installer-armel/current/images/versatile/netboot/initrd.gz


ftp://ftp.debian.org/debian/dists/wheezy/main/installer-armel/current/images/versatile/netboot/vmlinuz-3.2.0-4-versatile

5.3 啟動安裝畫面,安裝完 base 系統,至重新開機為止。

將底下指令另存為 buildarm.sh,再在 ~/qemu_image 目錄下執行即可。

qemu-system-arm -M versatilepb -m 512 \
        -kernel ./install/vmlinuz-3.2.0-4-versatile \
        -initrd ./install/initrd.gz \
        -hda arm.img \
        -append "root=/dev/sda1"

請執行 buildarm.sh

~/qemu_image/sh buildarm.sh

然後一步步安裝 ARM 版  Debian Linux。


6. 使用 Qemu 開機

2013年9月30日 星期一

Linux 核心編譯及相關知識

=== 編譯設定時請先注意核心版本是否正確,並確定是否有 64-bit kernel 選項 ===

設定核心參譯參數:

設定參數有三種選項,分別是:

1. M -> 編譯成模組,可即時載入/移除模組,舉例來說:搖桿的驅動程式是 joydev.ko,一般人電腦並沒有連接 USB 搖桿,因此我們無需隨時載入 joydev.ko 這個驅動程式模組,等到我們有接上 USB 搖桿時再來載入即可。
2. * -> 編譯並內嵌至核心,無法移除
3.   -> 不編譯此模組


驅動程式模組操作:

1. lsmod -> 觀看目前有那些驅動程式模組已載入至記憶體,其輸出如下:

herman@debian:~$ lsmod
Module                  Size  Used by
joydev                 17232  0
nvidia               9384645  29
drm                   211810  2 nvidia
nfsv3                  29787  1
rpcsec_gss_krb5        26504  0
nfsv4                 158090  0
nfsd                  192007  2
auth_rpcgss            39085  2 nfsd,rpcsec_gss_krb5
oid_registry           12419  1 auth_rpcgss
nfs_acl                12511  2 nfsd,nfsv3
nfs                   105982  3 nfsv3,nfsv4
lockd                  55577  3 nfs,nfsd,nfsv3
fscache                37551  2 nfs,nfsv4
sunrpc                160406  24 nfs,nfsd,rpcsec_gss_krb5,auth_rpcgss,lockd,nfsv3,nfsv4,nfs_acl

..
..

其中 Module 欄位是目前已載入至記憶體中之模組,Size 是該模組大小,Used by 是指該模組是否有被其它模組使用,舉例來說,如果我們執行:

lsmod|grep usb

會得到以下輸出:

usb_storage            48020  0
scsi_mod              158157  5 sg,usb_storage,libata,sd_mod,sr_mod
usbcore               134854  4 uhci_hcd,usb_storage,ehci_hcd,ehci_pci
usb_common             12440  1 usbcore

其中 usbcore 是 USB 驅動程式之主模組,它會被其它 USB 相關驅動程式模組所使用,例如 usb_storage 是用來驅動 USB 儲存裝置之模組,它必須有 usbcore 才能使用。

2. modprobe -> 載入驅動程式模組

請先執行 lsmod|grep joydev 看看目前是否有載入 joystick 之驅動程式模組。接著我們可以使用 root 權限來載入 joydev 驅動程式模組:

# modprobe joydev

載入後可以再執行一次 lsmod|grep joydev 來看目前是否有載入 joystick 之驅動程式模組,理論上其輸出如下:

joydev                 17232  0

這表示我們已成功載入 joydev 驅動程式模組。

3. rmmod -> 移除驅動程式模組

若我們要移除 joydev 模組的話,請以 root 權限執行底下指令:

# rmmod joydev

再以 lsmod|grep joydev 來看目前是否有載入 joystick 之驅動程式模組。



編譯核心參數設定

請以 root 權限在 /usr/src/linux 目錄下執行底下指令:

/usr/src/linux # make menuconfig

接著可以進行參數設定

1. General setup  --->
        Kernel compression mode (Gzip)  --->
                XZ
   目的:使用最高壓縮率之壓縮演算法以節省空間。

   [*] Enable loadable module support  --->

   目的:開啟可載入模組設定

        [*]   Module versioning support
        支援其它版本核心所編譯出來的模組,萬一有相容性的問題則無法支援。



2. Processor type and features  --->
        Processor family (Generic-x86-64)  --->
                Processor family (Core 2/newer Xeon)
   目的:把 CPU 由 Generic-x86-64 改為 Core 2/newer Xeon 可以加強在本機的
         效能,因為本機 CPU 是 Core 2 Duo (hint: cat /proc/cpuinfo)


         (512) Maximum number of CPUs

   目的:支援最高 512 顆 CPU。

   Bus options (PCI etc.)  ---> 設定電腦內部匯流排,例如 PCI、ISA .. etc.

3. Executable file formats / Emulations  --->
        [*] IA32 Emulation
        <*>   IA32 a.out support

   目的:在 64 位元 Linux 底下執行 32 位元 Linux 程式,例如 Adobe Reader 只出 32
        位元版 (i386 版),打開此參數可以讓我們所編譯的 Linux 核心支援此程式
        執行。

    --- Networking support  設定網路相關硬體及軟體
          Networking options  ---> 不要動,以免網路無法動作
    [ ]   Amateur Radio support  ---> 業餘無線電支援,請關閉,我們不需要。
    < >   CAN bus subsystem support  --->
    < >   IrDA (infrared) subsystem support  --->
    <M>   Bluetooth subsystem support  --->
    -*-   Wireless  ---
    < >   WiMAX Wireless Broadband support  --->
    < >   NFC subsystem support  --->


4. Device Drivers  ---> 此目錄底下有相當多的參數可以設定,請將不要的模組移除以
        減少空間。
        < > Parallel port support  --->  關閉,我們現在的電腦已經沒有 RS232
                的平行埠介面了。

        <M>   Loopback device support
        (8)     Number of loop devices to pre-create at init time
        < >     Cryptoloop Support
        loopback device 可以用來掛載光碟片的 ISO 檔,簡單來說它是 Linux 上的
        虛擬光碟。舉例來說,假設我們要掛在 debian 安裝 iso 檔,其檔名是:
        debian-7.1.0-amd64-CD-1.iso 的話,我們可以使用 root 的權限執行:
        # mount -o loop debian-7.1.0-amd64-CD-1.iso /mnt
        將此光碟片掛載至 /mnt 目錄下,此時系統會出現底下訊息:
        mount: warning: /mnt seems to be mounted read-only.
        這表示 /mnt (光碟片) 是唯讀目錄,無法寫入。我們可以使用 ls /mnt
        來觀看是否是光碟片內容。
        因此 Loopback device 參數一定要設定,否則將無法使用虛擬光碟。

        < > ATA/ATAPI/MFM/RLL support (DEPRECATED)  --->
        此參數有個 DEPRECATED 的單字,因此通常不再支援,除非你的電腦有接很老舊
        的裝置,否則可以不必編。


        <M> Serial ATA and Parallel ATA drivers  --->
        支援 SATA 介面,問題在於:我們如何知道本機 SATA 介面卡為何 ?

        lspci 可以看到底下資訊:

00:1f.2 IDE interface: Intel Corporation NM10/ICH7 Family SATA Controller [IDE mode] (rev 01)

        上述資料告訴我們本機的 SATA 介面是 Intel 的 NM10/ICH7 晶片,若想知道該晶
片使用那個模組的話,請執行:lspci -v,其輸出如下所示:

00:1f.2 IDE interface: Intel Corporation NM10/ICH7 Family SATA Controller [IDE mode] (rev 01) (prog-if 80 [Master])
        Subsystem: Giga-byte Technology Device b002
        Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 19
        I/O ports at 01f0 [size=8]
        I/O ports at 03f4 [size=1]
        I/O ports at 0170 [size=8]
        I/O ports at 0374 [size=1]
        I/O ports at f000 [size=16]
        Capabilities: <access denied>
        Kernel driver in use: ata_piix

============

            IEEE 1394 (FireWire) support  --->  取消,目前此介面幾乎沒人使用
        [ ] Macintosh device drivers  --->      取消,目前此介面幾乎沒人使用

============

        -*- Network device support  ---> 設定網路介面
                < >   ARCnet support  --->
                [ ]   ATM drivers  --->
                      *** CAIF transport drivers ***
                      Distributed Switch Architecture drivers  --->
                -*-   Ethernet driver support  ---> 設定網路卡驅動程式

        我們以 lspci -v 可以看到以下訊息:

03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)
        Subsystem: Giga-byte Technology GA-EP45-DS5/GA-EG45M-DS2H Motherboard
        Flags: bus master, fast devsel, latency 0, IRQ 43
        I/O ports at d000 [size=256]
        Memory at e5010000 (64-bit, prefetchable) [size=4K]
        Memory at e5000000 (64-bit, prefetchable) [size=64K]
        [virtual] Expansion ROM at e5020000 [disabled] [size=64K]
        Capabilities: <access denied>
        Kernel driver in use: r8169
        因此可以看到本機電腦所使用之網路卡驅動模組是 r8169,廠牌為 Realtek。

                < >   FDDI driver support
                [ ]   HIPPI driver support
                < >   General Instruments Surfboard 1000
                {M}   PHY Device support and infrastructure  --->
                < >   Micrel KS8995MA 5-ports 10/100 managed Ethernet switch (NEW
                < >   PLIP (parallel port) support
                {M}   PPP (point-to-point protocol) support
                      USB Network Adapters  --->  沒有 USB 網卡則全部關掉
                [ ]   Wireless LAN  ---> 沒有 wifi 無線網卡則全部關掉
                      WiMAX Wireless Broadband devices  ---> 沒有 wimax 卡則關掉
                [ ]   Wan interfaces support  --->
                < >   IEEE 802.15.4 drivers  --->
                < >   VMware VMXNET3 ethernet driver
                [ ]   ISDN support  --->

    <M> Sound card support  --->        音效卡支援
        --- Sound card support
        [ ]   Preclaim OSS device numbers
        <M>   Advanced Linux Sound Architecture  --->
        < >   Open Sound System (DEPRECATED)  --->

        音效卡我們只保留 ALSA,我們的音效卡是:

00:1b.0 Audio device: Intel Corporation NM10/ICH7 Family High Definition Audio Controller (rev 01)

        因此其驅動程式如下:

            [*]   PCI sound devices  --->
                <M>   Intel HD Audio  --->
                <M>   Intel/SiS/nVidia/AMD/ALi AC97 Controller
                <M>   Intel/SiS/nVidia/AMD MC97 Modem

        Graphics support  --->          顯示卡支援

        我們的顯示卡是

01:00.0 VGA compatible controller: NVIDIA Corporation G96 [GeForce 9400 GT] (rev a1)
        由於我只裝官方驅動程式,因此把 nouveau 關掉,兩者會相衝。

            < > Nouveau (nVidia) cards
        其餘驅動程式可以關閉以簡省空間。


        {*} Hardware Monitoring support  --->
        硬體監測驅動程式,因為我們看不到主機板上面的晶片,因此建議全部編譯,
        讓電腦開機時自動偵測並載入相對應之驅動程式模式。

        我們可以使用 lm-sensors 這個套件來看主機板上面的溫度/電壓/風扇

        sensors-detect

        偵測完畢後會出現底下訊息,告訴我們要載入那些模組以驅動硬體監視驅動
        程式。

Now follows a summary of the probes I have just done.
Just press ENTER to continue:

Driver `it87':
  * ISA bus, address 0x290
    Chip `ITE IT8718F Super IO Sensors' (confidence: 9)

Driver `coretemp':
  * Chip `Intel digital thermal sensor' (confidence: 9)

To load everything that is needed, add this to /etc/modules:
#----cut here----
# Chip drivers
coretemp
it87
#----cut here----
If you have some drivers built into your kernel, the list above will
contain too many modules. Skip the appropriate ones!

Do you want to add these lines automatically to /etc/modules? (yes/NO)

Unloading i2c-dev... OK
Unloading cpuid... OK



    {M} Generic Thermal sysfs driver  --->      溫度管理

    <M> Multimedia support  --->        設定視訊/電視卡之驅動程式模組

    <M> VFIO Non-Privileged userspace driver framework  ---> 將 VGA pass 給 qemu
        --- VFIO Non-Privileged userspace driver framework
        <M>   VFIO support for PCI devices
        [*]     VFIO PCI support for VGA devices


5.        Firmware Drivers  --->        某些硬體需要 firmware (韌體) 才能動作,
        這些韌體在 Debian 的 firmware* 套件中。
        大部份常見會用到的韌體是無線網卡,例如 b43 (broadcom) 無線網卡之類。

2013年4月1日 星期一

Debounce 電路設計

1. 何謂 Bounce (彈跳):

所謂的 Bounce 是指我們在按下電源開關時,電壓不會從 0 伏直接升到 VDD 伏。而是在 0 及 VDD 間震盪好幾次,最後才在 VDD 端穩定下來。

一個電子產品若有彈跳現象的話,最常見到的「症狀」是按下一個開關,結果數字跳好幾下。

2. 何謂 Debounce 電路 ??

為了解決彈跳問題,我們設計了 Debounce (反彈跳)電路,Debounce 電路的原理是:我們設定一個 Time Window,當波形能穿過這個 Time Window 時,才切換波形。

假設我們希望開關穩定的時間為 0.001 秒 = 1*10^-3 秒 = 1 ms

3. 如何設計 Debounce 電路 ??

a. 第一種作法:使用 AND 閘
利用 AND 閘來作 Debounce 電路可以在很短的時間之內設計完成,它的優點是簡單易懂。

缺點:
 * 單一 AND 閘之 Delay 相當短,要湊 1ms 可能需要很多的 AND 閘串接
 * 由於我們使用固定數量之 AND 閘,因此其 time window 不可改變,其彈性比較差

b. 第二種作法:使用 NOT 閘加一個超大 AND 閘
利用 NOT 閘來作 Debounce 電路可以在很短的時間之內設計完成,它的優點是簡單易懂。

上述兩種作法最大的缺點有二:
1. 佔空間:如果我們要設計的 debounce 電路之 time window 為 1ms,我們可能要串 1000 個 NOT 閘才能成功,這是相當佔空間的。
2. 沒彈性:如果我們有兩個專案,其中 A 專案的 debounce 時間為 1ms,而 B 專案的 debounce 時間為 1.5 ms,則我們必須針對兩個不同的專案設計出不同的 debounce 電路。

因此這兩種作法是比較差的 debounce 電路。

c. 第三種作法:兼具彈性及省空間的作法 ??
利用 Counter 電路來設計 debounce 電路可以解決上述兩個問題,因此我們可以看實體
電路設計。

low-active  -> 低態動作:輸入為 0 時動作。
high-active -> 高態動作:輸入為 1 時動作。

{a[7:3],b[2:0]}

2013年3月28日 星期四

Blender 物理引擎練習


練習 #1


  1. 將系統還原至初始狀態,將 Box 沿 Z 軸移動 5 個單位。
  2. 將上面選項由 Blender Render 改為 Blender Game
  3. 調整右側視窗,使得 Physics 工具出現
  4. 按 RMB 點選 Box,再按 Physics 工具,選擇 Rigid Body,此時底下會出現相對應的參數,我們將 Rigid Body Collisions 中的 Shape 由 Convex Hull 改為 Box。
  5. 按 p 可以執行 Game Engine,我們會看到方塊往下掉,按 Esc 回復原狀。
  6. 任意旋轉方塊,準備待會使用。
  7. 切換至視角 7,新增一個平面,放大 5 倍,此時我們可以打 p 來觀察物理引擎
  8.  執行狀態,我們會發現方塊掉進平面中。
  9.  將方塊的物理參數改為 static,再執行 p。


練習 #2



  1. 將方塊刪除,只留下平面
  2. 加入 UV Sphere,將此圓球沿 Z 軸往上移 5 個單位
  3. 修改 UV Sphere 之物理特性為 Rigid Body,並按 p 模擬看看,模擬完按 Esc
  4. 將平面延伸出一個斜坡,將 UV Sphere 移至斜坡上,並按 p 模擬看看,看 UV Sphere 是否會順著斜坡往下滾,我們可以調整不同視角來觀察其模擬狀態。
  5. 加入一個方塊,調整大小準備作骨牌用。將其物理特性設為 Rigid Body,並記得
  6. 將 Collision Bounds 設為 Box,然後按 p 模擬看球撞到骨牌的效應。設定完單一個骨牌後,我們可以按 Shift+d 來複製/貼上骨牌。


作業 2

請用骨牌蓋一個 10 層樓高的建築物,用球打倒,球打到前房子不能先垮下來。

練習:

請看底下網頁建立齒輪:
http://www.youtube.com/watch?v=zi6MxMM09Ek

其中的 Extra Mesh 在:
http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Add_Mesh/Add_Extra



如何使用 GPU 來加速 Blender 的運算



  1. 需求 - Blender 2.66 版、Nvidia 3D 加速卡、Nvidia 官方驅動程式

  2. 設定完 Blender 驅動程式後,請進入 Blender,在選單的: File -> User Preferences (快捷鍵:Ctrl + Alt + U) 呼叫出 User Preferences 視窗,在 System 項目下,將 Compute Device   選擇為 CUDA,選擇完請點選最底下的「Save User Settings」,如此一來即可使用 GPU 來加速 Blender 運算。


2013年3月25日 星期一

fpga 0325 講義


1. 雙向埠的原理及設計
   hw4 -> (VLSI 的 hw8a)
   bufif0 bufif1

2. 四(N)顆並聯的七段顯示器如何驅動 ?

   a. 先將腳位如何驅動七段顯示器量測出來,使用三用電表,切換至二極體模式,然後將腳位列表出來。
   b. 使用掃瞄方式撰寫 verilog code。
          ^^^^

什麼叫掃瞄 ?

假設我們要在四顆並聯的七段顯示器顯示 1234,我們會遇上一個問題是 a0~a3, b0~b3 .. h0~h3 全部都短路在一起,最主要的原因是為了節省腳位,在這種情況之下顯示會變成:

1111
2222
3333
4444
5555
..
依此類推。

如果要顯示 1234 的話,那麼我們要使用掃瞄的技巧,也就是一次點亮一顆七段顯示器,
例如:

1 -> d0 打開
2 -> d1 打開
3 -> d2 打開
4 -> d3 打開

其畫面如
http://www.youtube.com/watch?v=qxGxtjlfhTE
所示。

當掃瞄的速度很快(24 frames/sec)的時候,我們的眼睛會因為視覺暫留的原理誤以為全
部的七段顯示器都是「同時」點亮的。所謂的很快是指每秒有 24 張以上的動畫,以
1 kHz 的掃瞄速度來說,有四個字元,因此每個字元平均一秒掃 250 次,相當足夠。

3. FPGA 常見 I/O 為何 ?

   a. 輸入 - jumper、dip switch、button、keypad
   b. 輸出 - 七段顯示器、LED、矩陣 LED、LCD、VGA
   c. 雙向埠 - Memory

2013年3月22日 星期五

blender 0322 講義


練習 5a

1. 清除方塊,在視角 7 重新建立 plane
2. 進入編輯模式,只刪除面 (only faces)
3. 加入 circle,並按 s,再按 .5 來將半徑縮為 .5
4. 選擇所有端點,按 Alt+f 如此一來即可自動補面
5. 切換至視角 3,將中心圓垂直延伸(e) 1 個單位。
6. 將圓封面,有兩種作法:
   a. 選擇所有圓之端點按 f,將整個圓封個一個面
   b. 選擇所有圓之端點按 Alt+f,將整個圓,以三角形一個面的方式補面
7. 接下來切換至視角 3,並將整個面往上移一個單位。
8. 全選所有端點,按 Shift+d,複製整個面。
9. 將基準點 (pivot Center) 設為 3D Cursor,再按 r 旋 90 度、180 度以及 270
   度來貼上模型。如此一來,我們便封了 4 個面。
10. 切換至視角 1,重複之前選擇、複製、旋轉、貼上的流程,將剩下兩個面補齊。
11. 選擇所有端點,再按 Remove Doubles 按鍵,此時會出現 Removed 24 vertices。

blender 0315 講義


practice 2b

1. 回到視角 7 (xy 平面),清除 cube。
2. shift + a -> 新增 circle,按 e,按 Esc,按 s,按 0.4 將圓縮小為 0.4
3. 之前步驟請參考上週教學。

practice 2c
1. 進入編輯模式 (TAB),按 w 叫出視窗,再選 Bevel,或是快捷鍵 Ctrl+B
   可以新增倒角,但此種方式不適用於太複雜之模型,只適用簡單的方塊。

2. 在編輯模式下按 b,再用滑鼠左鍵拉框框可以選擇端點。
   在編輯模式下按 b,再用滑鼠中鍵拉框框可以取消選擇端點。

practice 3
齒輪
渦輪葉片 -> spin 工具


practice 4
動畫

設定動畫格數:


1. 在最底下視窗設定起始頁面為 1 (內定值),結束頁面為 35。我們可以用 LMB
   切換頁面。

旋轉

1. 請將右側視窗切換至 Object,我們在此可以調整 Rotation 參數。

2. 在第1頁時,按 I 叫出 "Insert Keyframe Menu" 視窗,並選擇 Rotation

3. 以 LMB 移至 35 頁,將方塊旋 360 度,然後按 I 叫出 "Insert Keyframe Menu"
   視窗,並選擇 Rotation

4. 按底下控制按鍵即可撥放動畫。




2013年3月18日 星期一

fpga 0318 講義


作業 3.
  請寫出 VLSI 作業 2 正緣觸發之 D 正反器,要寫以下版本:

a. gate level 版                檔名:dff_gate.v,gate level 版必須使用 XCircuit 畫出正緣觸發 D 正反器之電路圖。
b. rtl level 版 (alway @)       檔名:dff_rtl.v

請撰寫可自我偵測錯誤之 testfixture,並且適用於上述兩個不同版本之 DFF 電路,其輸出為 test_dff.dmp,檔名為 test_dff.v。

p2-6
數字表示:

 8'hec          ->  8'h 指有 8個位元 hex 數字,其值為 ec
16'd2048        -> 16'd 指有16個位元 digital 數字,其值為 2048
  o -> 八進位、b-> 二進元

24'b111111111111111111111111 = 24'b1111_1111_1111_1111_1111_1111


x -> unknown
z -> 高阻抗

# 10 test ok
# 20 test ok
# 30 test fail

p2-11

表 2-2 關鍵字,關鍵字的重要性在於我們不能拿關鍵字來當變數。例如以下寫法很糟糕:

reg if;

因為 if 為關鍵字,使用 if 當變數會有問題。


P3-7

範例 3-3

assign mount = s ? ma : mb;

if s = 1 mount = ma;
if s = 0 mount = mb;

P3-15

assign dbus = (enable == 1) ?  value1: 4'bz;

http://www.cse.psu.edu/~cg577/DOCUMENTS/codingstandards/verilog.html

儘量不要使用巢狀 ? : 來寫程式,以免看不懂,如上述網頁之例子。


P3-9 資料型態

1. 數值 0 1 x z

2. 連接線

3. 暫存器

4. 向量 ?

reg [7:0] a; -> a7a6a5a4a3a2a1a0
                27            s0
reg [0:7] b; -> a0a1 ........ a7

a 跟 b 有何不同 ? (大印地安 V.S. 小印地安)
http://www.prudentman.idv.tw/2007/11/big-endianlittle-endian.html

5. 數字 -> 無號數

6. 參數 -> 有限狀態機

7. 陣列、記憶體 -> 本學期沒有用到

8. 三態 -> 雙向埠

2013年3月11日 星期一

fpga 0311 - 針對 test fixture 的再進化


針對 test fixture 的再進化

我們剛剛寫好的 test fixture 有什麼缺點 ?

缺點1. 我們所測試出來的波形,系統無法自行判斷是正確或是錯誤的波形,得要由人類的眼睛來判斷。

缺點2. 輸入波形無法自動產生


針對缺點1之解決方式

我們使用行為模式(behavior model)來撰寫 testfixture,其目的是讓 testfixture 能自動產生 x+y 的半加器輸出,程式碼如下:

reg sumY, coutY;        // test result


// self calculate coutY, sumY
always @ ( a or b)
  begin
    {coutY, sumY} = a+b;
  end


並以此輸出來與原始 ha_gate/ha_rtl/ha_cont.v 中電路所產生之輸出作比對。

reg testok;             // 0 == error, 1 == testok;

// compare
always @ ( coutX or sumX )
begin
  if ( coutX == coutY && sumX == sumY)
    testok=1;
  else
    testok=0;
end

我們可以觀察 testok 的波形,當 testok == 1 時,我們的電路輸出與自動產生之電路輸出是一致的,萬一 testok == 0 時,兩者不一致,運算有錯,必須進行除錯。

針對缺點2之解決方式
a. 定義一個 clock 訊號源
b. 利用 clock 訊號源來產生訊號

fpga 0311 講義


$display 語法 (課本 p2-10 - p2-12)

$display("Hello world")

可以在螢幕上顯示 Hello world 字串,在半加器的測試檔中作以下修改:

initial begin
$display("Half Adder test begin!!");    // 加入此行
$dumpvars;
$dumpfile("testha.dmp");

#0 a=0;
   b=0;
   $display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX); // 加入此行

然後執行模擬,我們可以得到以下螢幕輸出:

Half Adder test begin!!
                   0=>a=0,b=0,sumX=x,coutX=x

從以上輸出我們可以得到當 a=0, b=0 的時候,sumX 跟 coutX 的值為 x (未知)。為什麼會有這個輸出結果 ?



原因:所有的電路都有延遲,當訊號在第 0 秒輸入時,不可能輸出就跟著改變。因此,
我們可以再修改程式碼如下:

#0      a=0;
        b=0;
        $display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX);

#1
        $display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX);

其輸出為:
Half Adder test begin!!
                   0=>a=0,b=0,sumX=x,coutX=x
                   1=>a=0,b=0,sumX=0,coutX=0

我們可以觀察上面的第二行,發現在第 1 個時間單位時,sumX=0, coutX=0。這表示經過一個時間單位的延遲之後,電路已完成運算並在輸出端看到結果。

現在有個問題,萬一我們每個訊號的改變都希望能從螢幕上看到數值,該如何作 ?

1. 每一個訊號改變都加上 $display ==> 累死人,我們最好不要作這種蠢事

2. 使用 $monitor ==> 比較聰明的作法

因此我們可以將測試檔改成:

initial begin
$display("Half Adder test begin!!");                            // 加入此行
$monitor($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX); // 加入此行
$dumpvars;
$dumpfile("testha.dmp");

#0      a=0;
        b=0;

其輸出為:

Half Adder test begin!!
                   0=>a=0,b=0,sumX=0,coutX=0
                  10=>a=0,b=1,sumX=1,coutX=0
                  20=>a=1,b=0,sumX=1,coutX=0
                  30=>a=1,b=1,sumX=0,coutX=1


我們可以看到只要加一行 $monitor 之後,系統即會根據輸出/入的變化而自動列印其數值,不必每一行都加 $display。

RTL level 的程式寫法

連接運算子 (p 5-19)

請將 half adder 以 rtl 方式撰寫出來


//RTL Level code                    | // Gate Level code
//ha_rtl.v                                 | // ha_gate.v
module half_adder(x, y, Sum, Cout); | module half_adder(x, y, Sum, Cout);
                                               |
input x, y;                                | input x, y;
output Sum, Cout;                   | output Sum, Cout;
reg Sum, Cout;                       |
                                              | // Circuit Description
// Circuit Description              |
                                             | xor xor0(Sum, x, y);
always @ (x or y)                  | and and0(Cout, x, y);
{Cout,Sum} = x+y;               |
                                            | endmodule
endmodule                           |

上面左邊的程式碼是告訴我們以 RTL 方式撰寫出來的 code,現在我們希望能將寫完的程式進行模擬,請執行:

cver ha_rtl.v test_ha.v

此時我們可以看到

1. $monitor 輸出與之前 ha_gate.v 相同
2. testha.dmp 亦相同


使用 continuous assignment 來撰寫 half adder:

module half_adder(x, y, Sum, Cout);

input x, y;
output Sum, Cout;

// Circuit Description

assign {Cout, Sum} = x + y;

endmodule

上面的例子是使用 assign 語法 (又稱為 continuous assignment,課本 p5-2) 來進行 half adder 的設計。

小結:在這三個半加器的例子中,我們使用了同一個 test fixture 來針對我們所寫的三個不同語法之半加器進行測試,而且測試後之結果均一模一樣。







2013年3月10日 星期日

Blender 0308 上課講義

第二種畫桌子的方法

1. 加入 Cube,將 Cube 左下角移至原點,並按 z 切換至骨架模式 (Wire frame)

a. 按 RMB 點選 Cube 以選擇 Cube,按 g 再押著 Ctrl 不放將左下角移至 0,0
   然後按 LMB。
b. 按 TAB 進入物件編輯模式,然後按 b 拉一個框框圈選最上面的端點。
c. 移動端點:按 g、按 y、按 3。
d. 取消端點選擇,然後選擇右側的面
e. 移動端點:按 g、按 x、按 8。到目前為止,我們會有一個方塊其大小為 5 x 10 x 2(高)
f. 移至視窗 3 (yz 平面),取消端點選擇,然後選擇最底下的面
g. 移動端點:按 g、按 z、按 1.7,此時我們即可得到一個 5 x 10 x 0.3 之方塊


練習 2

1. 回到初始狀態,刪除內建方塊
2. 切至視角 7,新增一個 Circle,其端點數為 32 (預設值),半徑 (Radius) 設為 1, fill type 設為 Triangle Fan,此時我們可以得到一片圓形。
3. 按 b 拉一個框框圈選左半圓的點,再按 x 然後將其刪除,刪完之後我們有半個圓。
4. 新增一個 plan,將此 plan 高度調為 1,並與半圓重疊
5. 刪半圓之某些端點,將圓切 plan 處加上一個新的端點,使用 k (knife) 工具。
6. 將切完之端點填面,可以選三個端點(按 Shift + RMB 點選) 再填面 (f)或是四個端點填面 (f)
7. 將 3D 遊標歸零 -> Shift +s -> Cursor to Grid / Cursor to Center
8. 全選所有端點,按 Ctrl + D 複製,將旋轉點  pivot 改為 3D 遊標,按 r 旋轉 180 度,即可完成一個重疊的圓。
9. 全選所有端點,按 Remove Double 按鍵,即可將重疊的端點「融合」
10. 移至視角 3,全選所有端點,按 e(extrude 延伸)、按 z、按 0.3

2013年3月3日 星期日

fpga 0304 上課講義


1. 如何證明我們所寫的半加器工作正確 ?

在 simulation command 的部份,我們需要針對半加器的動作來進行完整測試,請問什麼是半加器的完整測試 ? 要判別一個半加器是否完整動作,最簡單的方法是把真值表上的每一列都模擬一次,如果輸出/入之狀態完全符合真值表,則我們可以確認此電路工作正常。

x  y | Sum   Cout
-----+-----------
0  0 |   0      0
0  1 |   1      0
1  0 |   1      0
1  1 |   0      1

將全部可能的輸入訊號都跑一次模擬並檢查模擬結果是否正確,若全部正確的話,我們可以假設電路設計是對的。

2. 如何撰寫 test fixture (測試程式)

2.1 什麼是 test fixture ?

當我們寫完 verilog 電路後,我們必須證明它是對的,因此我們要寫 test fixture 來針對我們所寫的 verilog 程式進行測試。

2.2 test fixture 的內容

一個 test fixture 就是一個 verilog module,以半加器 test fixture 為例,其語法大致如下:

module test_ha;
reg   definition  -> 暫存器定義
wire  definition  -> 線定義
other definition  -> 其它定義

half_adder ha0 () -> 呼叫我們要進行測試的電路

initial begin                   -> 開始進行波形輸入
$dumpvars;                      -> 產生 gtkwave 語法
$dumpfile("testha.dmp");        -> 將波形以 VCD 格式存在 testha.dmp 檔中,
                                   testha.dmp 可照自己的需求改名字

simulation command   模擬指令,以下特別說明!!

$dumpall;                       -> 紀錄所有訊號
$dumpflush;                     -> 必要
#10 $finish;                    -> 在 10 個時間單位後結束模擬
end                             -> 結束 initial begin
endmodule

因此一個完整的半加器 test fixture 如下,我們將其存為 test_ha.v

module test_ha;
reg a, b;
wire sumX, coutX;

half_adder ha0(a, b, sumX, coutX);

initial begin
$dumpvars;
$dumpfile("testha.dmp");

#0      a=0;
        b=0;

#10     a=0;
        b=1;

#10     a=1;
        b=0;

#10     a=1;
        b=1;


$dumpall;
$dumpflush;
#10 $finish;
end
endmodule


2.3 進行 verilog 測試模擬

請執行

cver ha_gate.v test_ha.v \Enter

理論上應該輸出如下:

GPLCVER_2.12a of 05/16/07 (Linux-elf).
Copyright (c) 1991-2007 Pragmatic C Software Corp.
  All Rights reserved.  Licensed under the GNU General Public License (GPL).
  See the 'COPYING' file for details.  NO WARRANTY provided.
Today is Mon Mar  7 11:25:30 2011.
Compiling source file "ha_gate.v"
Compiling source file "test_ha.v"
Highest level modules:
test_ha

Halted at location **test_ha.v(25) time 40 from call to $finish.

我們會發現沒有 error、沒有 warning,而且會有個檔案叫 testha.dmp,接下來就可以用 GTKwave 觀察波形了。




3. 使用 GTKwave

請執行

gtkwave testha.dmp

來載入模擬波形檔,並觀察我們所寫的變數 (reg, wire .. 之類) 的輸出,若想將目前觀察狀態留待下次載入,請選擇

File -> Write Save File

存檔為 testha.sav,下次載入 gtkwave 時請執行:

gtkwave testha.dmp testha.sav

即可載入前一次觀察狀態。




作業 1. 畫 Full Adder 的電路圖
        以 Gate Level 寫 Verilog 程式
        撰寫 test fixture,並跑模擬,可存檔檔名為 testfa.dmp
        列印波形

2013年3月1日 星期五

blender 0301 上課講義


安裝執行 Blender

1. 請至 blender 網頁下載 Blender 檔案:

http://www.blender.org/download/get-blender/

下載

blender-2.63a-linux-glibc27-i686.tar.bz2

2. 將此檔案解壓縮至 /usr/local

/usr/local# tar jxfv 目錄/blender-2.63a-linux-glibc27-i686.tar.bz2

此時會解開一個 blender-2.63a-linux-glibc27-i686 目錄,其完整路徑為

/usr/local/blender-2.63a-linux-glibc27-i686

3. 在 /usr/local/bin 建一個 blender 之連結

/usr/local/bin# ln -s /usr/local/blender-2.63a-linux-glibc27-i686/blender .

4. 呼叫 Blender

在選單中啟動 Blender 或是直接輸入 blender,看是不是最新的 2.63a 版


Blender 基本操作:

視角切換(以鍵盤右側數字鍵盤來操作)

  • 7 -> yx 平面
  • 3 -> zy 平面
  • 1 -> xz 平面
  • 0 -> Camera 視角
  • 5 -> 切換透視投影 / 平行投影

基本操作
  • 旋轉視角 -> MMB 按著移動滑鼠可以旋轉視角
  • 拉近/拉遠與物件的距離 -> MMB 滾輪
  • 平移視角 -> 左手先按 Shift + 右手按 MMB 再移動
  • 選取物件 -> 以 RMB 點選不同的物件,這裡面的物件泛指 3D 物件、Camera、燈源皆是物件。
  • 刪除物件 -> 先選取物件,再按 x,此時會出現一個 Delete 視窗,請點 OK 即可刪除物件。
  • 還原上一步 -> Ctrl + z,可以還原上一步,例如將剛剛刪除的物件還原回來
  • z -> 切換著色模式/網格模式
  • 新增物件 -> 選單 Add -> Mesh 可以新增基本物件,其快捷鍵為 Shift + a
  • 旋轉物件 -> r 移動滑鼠
    • 若臨時不想執行旋轉操作,可以按 Esc 退出,
    • 若要固定角度旋轉,請按 r 之後,將左手按 Ctrl,右手移動滑鼠,如此一來可以以 5 度角為單位旋轉物件。
    • 若想針對某軸進行特定角度旋轉,請在左下角 rotation 小表格中直接填入該軸的旋轉角度。
  • 縮放物件 -> s 移動滑鼠
    •         a. 若臨時不想執行縮放操作,可以按 Esc 退出,
    •         b. 若要固定單位縮放,請按 s 之後,將左手按 Ctrl,右手移動滑鼠,如此一來
    •            可以以 0.1 為單位旋轉物件。
    •         c 若想針對某軸進行縮放,請按 s 之後,再按該軸 (x or y or z),右手移動
    •           滑鼠,如此一來可以沿該軸縮放。
  • 移動物件 -> g 移動滑鼠
    • 若臨時不想執行移動操作,可以按 Esc 退出,
    • 若要固定單位移動,請按 s 之後,將左手按 Ctrl,右手移動滑鼠,如此一來可以以 0.1 為單位移動物件。
    • 若想針對某軸進行移動,請按 s 之後,再按該軸 (x or y or z),右手移動滑鼠,如此一來可以沿該軸移動。
  • 取消/全選物件 -> a
  • 複製物件 -> Shift + d

2013年2月20日 星期三

自序

算一算,自民國 83 年起至現在,筆者玩 Linux 已經超過 17 年了,當初玩 Linux 曾經有裝過五十幾片磁碟片的,後來出了雲觀光碟可以一次搞定安裝 Slackware,再後來出了 Redhat Linux,一直到現在玩的 Debian 作業系統。我還記得當初為了要在 Linux 上看中文字得從倚天中文字形轉成 Linux 可用的格式,而 chdrv 更是當初不可或缺的工具。一開始玩 Linux 作業系統時,Linux 被眾多作業系統大廠笑稱之為「高級玩具作業系統」。的確,那時候的 Linux 比上 (Solaris、HP Unix、IBM AIX ..) 不足,比下 (Dos、 Minix ) 有餘。然而物換星移到了今天,當初許多的作業系統大廠已經消失了,而這個當年的「玩具作業系統」卻登堂入室,成為高科技產業不可或缺的一部份,從伺服器架設,Android 手機/平板、嵌入式系統乃至於機器人控制 .. 等在在可看見 Linux 的身影。

這本書是筆者累積這幾年教學經驗所整理的教學內容,其主要目的是以 Debian Linux 為基礎教導讀者一步步從文字介面安裝、設定乃至於完整的中文桌面環境,再至程式設計環境架設等。筆者希望本書可以讓一般學生在一個學期內完成本書的內容,以此書學習到的內容為基礎,讀者可以在進入 Linux 伺服器管理甚至是嵌入式 Linux/Android 系統開發等領域都會變得比較容易。

由於這本書主要是寫給 Linux 入門的初學者看的,因此筆者盡可能把安裝過程螢幕上的資訊一一截取下來,讓初學者能按圖索驥以利學習,希望藉此降低初學者安裝、學習過程中遇到問題卻無法解決的困境。

本書「不保證」你能順利安裝 Linux,亦「不保證」你的主機不會因此受到損壞(包括硬體損壞及軟體損壞或資料毀損)。從另一方面來說,由於筆者學識不足能力有限,書裡錯誤疏漏之處在所難免,望請各位多多海涵。

李博明 謹誌 於南台科技大學 電子系

推薦序


2013年1月17日 星期四

如何在 RPI 板子上編譯 Quake 3 程式


http://www.raspberrypi.org/phpBB3/viewtopic.php?f=78&t=18853

1. 下載必要套件

# apt-get install git gcc build-essential libsdl1.2-dev

2. 下載 quake3 的程式碼

請以 pi 權限執行

git clone https://github.com/raspberrypi/quake3.git

或至 ftp 下載解壓縮 quake3.tar.xz

下載完畢後我們會有一個目錄叫 quake3

3. 編譯設定檔

請切換至 quake3 目錄,編譯 build.sh,修改以下部份:

ARM_LIBS=/opt/bcm-rootfs/opt/vc/lib
改成
ARM_LIBS=/opt/vc/lib

INCLUDES="-I/opt/bcm-rootfs/opt/vc/include -I/opt/bcm-rootfs/opt/vc/include/interface/vcos/pthreads"
改成
INCLUDES="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads"

CROSS_COMPILE=bcm2708-
改成
#CROSS_COMPILE=bcm2708-

修改完畢後可以開始編譯

4. 編譯 quake3

請執行

time sh ./build.sh

即可開始編譯,如果你的環境設定都沒問題的話經過約一個小時後會編譯完 quake3。
編譯完畢後,我們可以在 ~/quake3/build/release-linux-arm/
看到 ioquake3.arm 這個可執行檔。在執行此檔案前,我們要先將 q3 的地圖檔放
至 ~/quake3/build/release-linux-arm/baseq3 目錄。

5. 放地圖檔

請下載 quake3 Demo 檔案,指令如下:

wget http://dl.dropbox.com/u/1816557/Q3%20Demo%20Paks.zip

執行完畢後會下載一個檔案名為 Q3 Demo Paks.zip,請執行 unzip 解開

unzip "Q3 Demo Paks.zip"

此時會解開 baseq3 的目錄,底下有 pak0.pk3 ~ pak8.pk3 這 9 個檔案。

將 baseq3 目錄下的檔案移至 ~/quake3/build/release-linux-arm/baseq3

接著再執行 ioquake3.arm 檔案即可進入 quake3。

如何建立 Raspberry Pi SD Card

1. 下載 2013-02-09-wheezy-raspbian.zip
  a. 從官方網站下載 - http://www.raspberrypi.org/downloads
  b. 從我的映像站下載

2. 解開 2013-02-09-wheezy-raspbian.zip

unzip 2013-02-09-wheezy-raspbian.zip

此時會解開出一個 2013-02-09-wheezy-raspbian.img 的影像檔,我們可以使用之前所介紹掛載 sdcard.img 的方式來掛載此檔以觀察其內容。

3. 掛載 2013-02-09-wheezy-raspbian.img 檔案

a. 請先切換至 root 權限 (su)

b. # losetup /dev/loop0 2013-02-09-wheezy-raspbian.img

   此指令是將 2013-02-09-wheezy-raspbian.img "連接" 至 /dev/loop0 這個裝置

   # losetup -a -> 觀察連接的結果,其輸出如下:

/dev/loop0: [0805]:999425 (/home/herman/raspberry/2013-02-09-wheezy-raspbian.img)

我們可以得知 /dev/loop0 已經跟 2013-02-09-wheezy-raspbian.img 連接在一起。接著我們可以執行 fdisk -lu 來觀察 /dev/loop0 這個裝置,請執行底下指令:

   # fdisk -lu /dev/loop0

其輸出如下:

Disk /dev/loop0: 1939 MB, 1939865600 bytes
255 heads, 63 sectors/track, 235 cylinders, total 3788800 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
Disk identifier: 0x00017b69

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
Partition 1 does not end on cylinder boundary.
/dev/loop0p2          122880     3788799     1832960   83  Linux
Partition 2 does not end on cylinder boundary.

c. 將 2013-02-09-wheezy-raspbian.img 的第一分割區"連接"至 /dev/loop1,其指令如下:

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

我們可以執行 losetup -a 來觀察連接結果,其輸出如下:

/dev/loop0: [0805]:999425 (/home/herman/raspberry/2013-02-09-wheezy-raspbian.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 4194304

接著將 2013-02-09-wheezy-raspbian.img 的第二分割區"連接"至 /dev/loop2,其指令如下:

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

我們可以執行 losetup -a 來觀察連接結果,其輸出如下:

/dev/loop0: [0805]:999425 (/home/herman/raspberry/2013-02-09-wheezy-raspbian.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 4194304
/dev/loop2: [0005]:1312 (/dev/loop0), offset 62914560

這表示 /dev/loop1 及 /dev/loop2 都連接至正確的分割區,接著就可以進行掛載。

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


#  mount /dev/loop1 /mnt/sdcard1

將 /dev/loop2 掛載至 /mnt/sdcard2 目錄

#  mount /dev/loop2 /mnt/sdcard2

若無 /mnt/sdcard1 /mnt/sdcard2 目錄的話,請先執行底下建立:

#   mkdir -p /mnt/sdcard1 /mnt/sdcard2

掛載完後請執行 df -h 來觀察是否已掛載成功,其輸出如下:

檔案系統              Size  Used Avail Use% 掛載點
/dev/loop1             56M   17M   40M  30% /mnt/sdcard1
/dev/loop2            1.8G  1.4G  315M  82% /mnt/sdcard2


e. 切換至 /mnt/sdcard1 /mnt/sdcard2 目錄來觀察其內容。

   cd /mnt/sdcard1
   ls -l

   我們可以看到此分割區為 bootloader 及 kernel 之目錄,其輸出如下:
-rwxr-xr-x 1 root root   17764 2012-10-29 01:40 bootcode.bin
-rwxr-xr-x 1 root root     142 2012-12-16 01:43 cmdline.txt
-rwxr-xr-x 1 root root    1180 2012-12-16 01:43 config.txt
-rwxr-xr-x 1 root root    2020 2012-10-29 01:40 fixup_cd.dat
-rwxr-xr-x 1 root root    5282 2012-10-29 01:40 fixup.dat
-rwxr-xr-x 1 root root     137 2012-12-17 03:51 issue.txt
-rwxr-xr-x 1 root root 2104952 2012-10-29 01:40 kernel_cutdown.img
-rwxr-xr-x 1 root root 9522048 2012-10-29 01:40 kernel_emergency.img
-rwxr-xr-x 1 root root 2695192 2012-10-29 01:40 kernel.img
-rwxr-xr-x 1 root root  523144 2012-10-29 01:40 start_cd.elf
-rwxr-xr-x 1 root root 2347828 2012-10-29 01:40 start.elf

   cd /mnt/sdcard2
   ls -l

我們可以看到此分割區為 rootfs 之目錄,其輸出如下:

drwxr-xr-x  2 root root  4096 2012-12-16 02:16 bin
drwxr-xr-x  2 root root  4096 2012-12-16 01:43 boot
drwxr-xr-x  3 root root  4096 2012-12-16 02:16 dev
drwxr-xr-x 95 root root  4096 2012-12-17 03:39 etc
drwxr-xr-x  3 root root  4096 2012-12-17 03:39 home
drwxr-xr-x 12 root root  4096 2012-12-16 02:05 lib
drwx------  2 root root 16384 2012-12-16 01:28 lost+found
drwxr-xr-x  2 root root  4096 2012-12-16 01:31 media
drwxr-xr-x  2 root root  4096 2012-09-03 01:08 mnt
drwxr-xr-x  3 root root  4096 2012-12-16 01:42 opt
drwxr-xr-x  2 root root  4096 2012-09-03 01:08 proc
drwx------  2 root root  4096 2012-12-16 01:31 root
drwxr-xr-x  7 root root  4096 2012-12-17 03:37 run
drwxr-xr-x  2 root root  4096 2012-12-16 02:16 sbin
drwxr-xr-x  2 root root  4096 2012-06-20 17:23 selinux
drwxr-xr-x  2 root root  4096 2012-12-16 01:31 srv
drwxr-xr-x  2 root root  4096 2012-11-27 17:13 sys
drwxrwxrwt  2 root root  4096 2012-09-03 01:08 tmp
drwxr-xr-x 10 root root  4096 2012-12-16 01:31 usr
drwxr-xr-x 11 root root  4096 2012-12-16 01:31 var

4. 解除掛載

a. 解除掛載 目錄

   # umount /mnt/sdcard1
   # umount /mnt/sdcard2
   使用 df -h 來觀察是否已解除掛載

b. 解除 loop 連接

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

   使用 losetup -a 來觀察是否已解除連接




** 將 2013-02-09-wheezy-raspbian.img 下載至 sdcard **

1. 首先將 SD card 放入讀卡機,並接上電腦,然後執行 dmesg 觀察最後面輸出之
   SD card 的代號,例如:

[11237833.478264] sd 4:0:0:0: [sdb] 7673856 512-byte logical blocks: (3.92 GB/3.65 GiB)
[11237833.478885] sd 4:0:0:1: [sdc] Attached SCSI removable disk
[11237833.479635] sd 4:0:0:2: [sdd] Attached SCSI removable disk
[11237833.480265] sd 4:0:0:3: [sde] Attached SCSI removable disk
[11237833.481313] sd 4:0:0:0: [sdb] Write Protect is off
[11237833.481317] sd 4:0:0:0: [sdb] Mode Sense: 03 00 00 00
[11237833.482161] sd 4:0:0:0: [sdb] No Caching mode page present
[11237833.482165] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[11237833.486012] sd 4:0:0:0: [sdb] No Caching mode page present
[11237833.486017] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[11237833.488435]  sdb: sdb1 sdb2
[11237833.491524] sd 4:0:0:0: [sdb] No Caching mode page present
[11237833.491529] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[11237833.491533] sd 4:0:0:0: [sdb] Attached SCSI removable disk

從上面訊息我們可以得知 SD card 是 /dev/sdb 這個裝置,其容量為 3.92 GB = 4 GB

2. 將 2013-02-09-wheezy-raspbian.img 植入 SD card
   請先切換至 root 權限,再執行:

   # dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdb bs=1024k

   經過 N 分鐘後會完成植入流程,N 自 5 ~ 8 不等,看記憶卡的速度。執行完畢後之輸出如下:

1850+0 records in
1850+0 records out
1939865600 bytes (1.9 GB) copied, 656.276 s, 3.0 MB/s



3. 掛載實體 SD card

# mount /dev/sdb1 /mnt/sdcard1
# mount /dev/sdb2 /mnt/sdcard2

使用 df -h 來觀察其輸出,如下所示:

檔案系統              Size  Used Avail Use% 掛載點
/dev/sdb1              56M   17M   40M  30% /mnt/sdcard1
/dev/sdb2             1.8G  1.4G  315M  82% /mnt/sdcard2

4. 觀察 SD card

   cd /mnt/sdcard1 目錄觀察
   cd /mnt/sdcard2 目錄觀察



5. 修改開機參數

   cd /mnt/sdcard1
   vi config.txt

   將
#hdmi_safe=1 改為
hdmi_safe=1

接著我們就可以拿 SD card 至 raspberry pi 板子上開機。