KGDB
下載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
文件系統
從pokylinux.org網站上下載一個他們編譯好了的根文件系統的壓縮包然後安裝上去. 步驟:
$ 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-lsb-dev-qemux86-64.tag.bz2 -C disk
qemu X86_64啟動參數
如果你的硬盤是sata接口的,你也許需要將上面的 「root=/dev/hda」 替換為 「root=/dev/sda」.
qemu -kernel /usr/src/work/bzImage -append "root=/dev/hda" -boot c -hda /usr/src/work/busybox.img -k en-us
qemu-system-x86_64 -m 512 -kernel ./bzImage -localtime -append "root=/dev/sda" -boot c -hda ./busybox.img -k en-us -redir tcp:5555::22
將qemu系統的中的linux ssh 22端口映射本地的TCP 5555端口上.可以通過ssh連接到qemu的系統上.這塊我試了不行啊. -redir tcp:5555::22
KGDB連接:
先啟動qemu.可以參考下面的命令:
$ qemu-system-x86_64 -m 512 -kernel ./bzImage -localtime -append "root=/dev/sda kgdboc=ttyS0,115200 kgdbwail"\
-boot c -hda ./busybox.img -k en-us -serial tcp::4321,server
這時,運行qemu的終端將提示等待遠程連接到本地端口4321:
QEMU waiting for connection on: tcp:0.0.0.0:4321,server
這時需要啟動另一個終端,運行GDB使用remote模式連接到剛Kernel.
$ gdb vmlinux
$ (gdb) target remote localhost:4321
Remote debugging using localhost:4321
kgdb_breakpoint () at kernel/debug/debug_core.c:983
983 wmb(); /* Sync point after breakpoint */
(gdb)
or
$ ./boot-linux.sh
也可以使用shell腳本:
#!/bin/bash
gdb = "target remote localhost:4321"
gdb vmlinux
echo $gdb
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等,在我們平時的開發和調試中可以使用,我們自己也 可以根據需要寫一些接口。