因為打算學一學linux驅動編程了,特意買了一塊raspberry來作為開發環境。直接通過鏡像按照的核心並不能直接用來做模組開發,因為發行版自身是不帶核心源碼樹的,但是模組開發這個是必要的。所有要進行核心模組開發第一步就是要編譯核心。具體到不同版本的raspberry,編譯方法有細微的差別,這個raspberry官方有一篇文檔專門將這個。我這個核心的編譯過程主要就是參考這篇 KERNEL BUILDING 文章的。核心編譯有兩種方法,一種是在raspberry本地編譯,另一種是在另外一台機器上編譯好然後考到raspberry的記憶卡上。直接在raspberry上編譯編譯比較簡單但是比較花時間,我編譯花了大概一個多小時,我個人認為這速度還可以:)。另一種是在pc上交叉編譯,得益於官方提供的交叉編譯工具,raspberry kernel在pc上的編譯過程也比較簡單。我這裡記錄下我在raspberry上編譯的過程。 核心編譯
1、下載linux核心源碼,我直接放在使用者主目錄了,這個在編譯模組的時候是會用到的。
git clone --depth=1 https://github.com/raspberrypi/linux
2、 安裝缺少的依賴。
sudo apt-get install bc
3、 核心配置,pi1和pi2,3不一樣。我這裡的是pi3,所以我只說明pi3的,pi1參考官方文檔。
cd linuxKERNEL=kernel7make bcm2709_defconfig
4、 編譯安裝核心和模組。
make -j4 zImage modules dtbssudo make modules_installsudo cp arch/arm/boot/dts/*.dtb /boot/sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img
5、 reboot或者開機重啟下,使用uname看下核心版本是否發生了變化。 模組開發
我這裡使用的是《LINUX裝置驅動程式》這本書上的例子來做的。下面是一個過程的 記錄。
1、 使用編輯軟體編輯模組原始碼,我的是hello.c
#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){ printk(KERN_ALERT "Hello, world\n"); return 0;}static void hello_exit(void){ printk(KERN_ALERT "Goodbye, cruel world\n");}module_init(hello_init);module_exit(hello_exit);
2、 編輯Makefile檔案,我這個比較簡單只是用來測試用的。
obj-m := hello.o
3、 在命令列中編譯模組。-C參數指定核心源碼樹位置,M為模組源碼所在目錄。modules沒搞明白是幹嘛的。
make -C ~/linux M=/home/pi/workspace modules
4、 模組的安裝卸載及其輸出的查看。
insmod ./hello.kormmod hellotail -2 /var/log/syslog
第一個簡單的模組就這樣編譯完了,有了這些準備為我們後面的模組開發做準備。另外一些模組開發環境的配置方法可以參考這篇
著網線了。然後將ip地址設定為靜態密碼,以後每次啟動時,路由器都會自動將這個ip分配給樹莓派。
1、 將樹莓派串連到路由
通過有線來串連,因為有線串連的好處是不要求輸入密碼,把線接上就可以使用了。接上網卡,接通電源,然後現在就可以串連樹莓派了。在此之前第一步是要擷取到樹莓派的ip,第一次連的時候樹莓派的ip地址是路由器隨機分配的。進入路由器管理頁面就可以看到。
2、擷取到了ip,樹莓派的預設使用者是pi,密碼是raspberry。可以通過上面的資訊登入了。具體登入工具通過ssh來登入。在ssh登入工具中輸入ip,使用者名稱和密碼就可以了。如果是linux系統,可以使用下面的命令來登入。192.168.0.101是我的樹莓派分配到的ip,以每個人的情況不同。
$ ssh pi@192.168.0.101
3、登入之後修改網卡資訊。修改之前可以先看下網卡資訊,使用 $ iftop 來查看。可以看到一個wlan0就是我的無線網卡了。後面通過vim配置網卡的資訊。我的樹莓派安裝的是Raspbian。基於debian的,所以他的網卡路徑和debian一樣的。修改/etc/network/interfaces檔案。
auto loiface lo inet loopbackiface eth0 inet dhcpallow-hotplug wlan0iface wlan0 inet staticwpa-ssid netgear #你要串連的wifi ssidwpa-psk 1234567890 #你的wpa串連密碼 address 192.168.1.110 # 設定的靜態IP地址netmask 255.255.255.0 # 網路遮罩gateway 192.168.1.1 # 網關network 192.168.1.1 # 網路地址#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf #注釋掉這一行iface default inet dhcp
然後重啟下就可以了,就可以進入到系統了。