KGDB + QEMU + SSH

Kernel下載與編譯

下載kernel

http://www.kernel.org 下載最新的源碼,然後解壓.

$ tar xvf linux.tar.gz
$ cd linux

kernel 編譯

如果直接在源碼目錄下進行編譯會產生很多臨時性的中間文件.這些文件會給我們帶來一些不便.為了使源碼文件和編譯產生的臨時文件分開,在源碼目錄同級目錄創產一個新的目錄obj.然後進行linux目錄進行用大寫字母O來指定obj目錄的路徑.

mkdir obj
cd linux
make O=../obj defconfig
make mrproper
make O=../obj -j16

文件系統

http://adtrepo.yoctoproject.org/2.0.0/rootfs/qemux86-64/

從pokylinux.org網站上下載一個他們編譯好了的根文件系統的壓縮包然後安裝上去. 步驟:

需要下載 sato 才有支援ssh

$ dd if=/dev/zero of=./busybox.img bs=1M count=4096 (busybox.img文件是4G大小)
$ mkfs.ext3 busybox.img
$ mkdir disk
$ sudo mount -o loop busybox.img disk
$ tar xvf core-image-sato-dev-qemux86-64.tar.bz2 -C disk

qemu X86_64啟動參數:

如果你的硬盤是sata接口的,你也許需要將上面的 「root=/dev/hda」 替換為 「root=/dev/sda」.

qemu-system-x86_64 -m 512 -kernel ./obj/linux-x86-basic/arch/x86/boot/bzImage -localtime -append "root=/dev/sda" -boot c -hda ./busybox.img -k en-us -redir tcp:5555::22
qemu-system-x86_64 \
-enable-kvm -m 1024 \
-localtime \
-kernel obj/$LINUX_PALTFORM/arch/x86_64/boot/bzImage \
-hda ./busybox.img \
-boot c \
-append "root=/dev/sda" \
-redir tcp:5555::22
  • 使用kgdb
qemu-system-x86_64 -s -S \
-localtime \
-kernel obj/$LINUX_PALTFORM/arch/x86_64/boot/bzImage \
-hda ./busybox.img \
-boot c \
-append "root=/dev/sda" \
-redir tcp:5555::22
cgdb ./obj/linux-x86-basic/vmlinux
target remote localhost:1234
b *start_kernel
c
  • 使用ssh 登入
ssh -p 5555 root@localhost

用 scp/sshfs 建構便利的開發環境

以下指令都在 Host 端執行 複製 file.txt 到 ARM 環境的/root(舉例)

scp -P 2200 file.txt root@localhost:/root
scp -P 5555 kernel_build.log root@localhost:/home/root

直接使用ssh遠端操作(以編譯go程式為例子,後面接想要做的事情就對了)

ssh -p2200 root@localhost /go/bin/go build hello.go

要一直用 scp 複製檔案到 QEMU 環境很麻煩,而且又會佔用 QEMU image 的空間,這時候就可以透過 sshfs。以下示範將 QEMU/ARM 環境的 /tmp 掛載在 host 端的 target 目錄:

mkdir -p target
sshfs root@localhost:/tmp target -p 2200

在關閉 ARM 之前,記得要 umount,不然資料會遺失

fusermount -u target

debugfs 調試

在kernel裡有一個debugfs文件系統,可能查下當前設置的電源狀態.需要在kernel中打開這個CONFIG_DEBUG_FS宏定義.

# mount -t debugfs none /sys/kernel/debugfs
# cd regulator

LFTP

用lftp命令行進行同步,也可以用crontab來定時同步或備份.

lftp -u user2168641,pwd -e "mirror -R /git/workspack/ritter-code/build/html/ www" www20.subdomain.com 下面看一下關於crontab的相關配置說明::

$ crontab -e

* * * * * command
| | | | `-------- 表示一個星期中的第幾天
| | | `---------- 表示月份
| | `------------ 表示一個月份中的第幾日
| `-------------- 表示小時
`---------------- 是表示分鐘

在12月內,每天的早上6點到1 點中,每隔3個小時執行一次 /usr/bin/backup:

0 6-12/3 * 12 * /usr/bin/backup
   |   `------------------------ 每隔3個小時.
   `---------------------------- 早上6點到12點之間.

MIPI LCD

查看寄存器

$ adb root
$ adb shell
# mount -t debugfs none /sys/kernel/debug
# cd /sys/kernel/debug/mdp-dbg/

這個目錄下面有三個接口,分別是:

base off reg 其中 base 為只讀接口,用於獲取需要讀取的寄存器組的基地址, cat base 後獲取到下面的信息:

mdp_base  :    e1900000
mddi_base :    00000000
emdh_base :    00000000
mipi_dsi_base: e5900000

off 接口用於指定需要讀取或寫入的寄存器地址,比如我們要讀取MIPI DSI中的從 0x0 開始的 10 個寄存器的值, 一共有63個寄存器 輸入以下命令:

echo "0x0 10 0xe5900000" > off 之後執行 cat reg 可以讀取到這 10 個寄存器的值,具體結果如下:

0xe5900000: 00000000 00000000 11111000 11119230
0xe5900010: 31211101 3e2e1e0e 00001900 00000000
0xe5900020: 02480068 03400020

reg 接口也可以用來寫寄存器,但是一次只能寫一個寄存器,具體為上面 off 中指定的地址,如:

echo "0x0" > reg

PS:無論是kernel本身還是高通的平臺相關代碼,都提供了一些很實用的debugfs 接口,比如clk,regulator等,在我們平時的開發和調試中可以使用,我們自己也 可以根據需要寫一些接口。