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等,在我們平時的開發和調試中可以使用,我們自己也 可以根據需要寫一些接口。