mini2440開發闆學習筆記
我的環境:
主機:ubuntu 64位
開發闆:mini2440
買來的新的開發闆一般來說,uboot、核心和檔案系統都配置好了。
mini2440開發闆的核心是2.6.32.2版本的。
學習步驟:
一、直接将uboot、核心和檔案系統全部擦除,在裸機上編寫學習,然後學習uboot的燒寫、核心的移植等。(個人不建議這種方法,對一個新手來說,uboot,核心等太過複雜)
二、在配置好的開發闆上進行,linux驅動的學習。不過有一個問題是要先進行2.6.32.2版本的核心樹的配置(在編譯驅動程式時使用).
2.1、核心樹的建構
(1)在友善之臂官網下載下傳源碼
linux-2.6.32.2-mini2440-2-110413.tar.gz
(2)在/opt/FriendlyARM/目錄下創mini2440檔案夾
$ sudo mkdir/opt/FridendlyARM/mini2440 并進入該目錄
$ cd /opt/FridendlyARM/mini2440
(3)将下載下傳的源碼移動到mini2440檔案夾,并解壓
tar -zxvf linux-2.6.32.2-mini2440-2-110413.tar.gz
(4)配置編譯檔案
進入目錄
$ cd /opt/FriendlyARM/mini2440/linux-2.6.29
$ cp config_mini2440_t35 .config
(5)配置核心
$sudo apt-get install libncurses5-dev
$ make menuconfig
出現配置的界面不用修改直接點選Load an Alternate Configuration File
然後确認、退出
(6)Makefile檔案修改
在/opt/FriendlyARM/mini2440/linux-2.6.29下運作
$ sudo vi./Makefile
搜尋arm-linux得到一個結果
CROSS_COMPILE?= arm-linux-
然後搜尋CROSS_COMPILE,找到
AS= $(CROSS_COMPILE)as
LD= $(CROSS_COMPILE)ld
CC= $(CROSS_COMPILE)gcc
CPP= $(CC) -EAR= $(CROSS_COMPILE)ar
NM= $(CROSS_COMPILE)nm
STRIP= $(CROSS_COMPILE)strip
OBJCOPY= $(CROSS_COMPILE)objcopy
OBJDUMP= $(CROSS_COMPILE)objdump
這裡定義了交叉編譯檔案的位置本例中作如下修改
(其中/usr/local/arm/4.4.3/bin/arm是安裝的arm-linux-gcc所在的位置
#AS= $(CROSS_COMPILE)as
AS = /usr/local/arm/4.4.3/bin/arm-linux-as
#LD= $(CROSS_COMPILE)ld
LD = /usr/local/arm/4.4.3/bin/arm-linux-ld
#CC= $(CROSS_COMPILE)gcc
CC = /usr/local/arm/4.4.3/bin/arm-linux-gcc
CPP= $(CC) -E
#AR= $(CROSS_COMPILE)ar
AR = /usr/local/arm/4.4.3/bin/arm-linux-ar
#NM= $(CROSS_COMPILE)nm
NM = /usr/local/arm/4.4.3/bin/arm-linux-nm
#STRIP= $(CROSS_COMPILE)strip
STRIP = /usr/local/arm/4.4.3/bin/arm-linux-strip
#OBJCOPY= $(CROSS_COMPILE)objcopy
OBJCOPY = /usr/local/arm/4.4.3/bin/arm-linux-objcopy
OBJDUMP= $(CROSS_COMPILE)objdump
#OBJDUMP = /usr/local/arm/4.4.3/bin/arm-linux-objdump
到這裡準備工作完成
(7)編譯
$ sudo make prepare
$ sudo make scripts
$ sudo make
sudo make一般會出現一兩個常見的錯誤
,直接百度搜尋修改就行了
到這裡核心源碼樹配置完成。
2.2 代碼編寫。
這裡我們先寫個簡單的
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
//子產品許可證
MODULE_LICENSE("Dual BSD/GPL");
//子產品加載函數
static int hello_init(void)
{
printk("<1>Hello World enter!\n");
return 0;
}
//子產品解除安裝函數
static void hello_exit(void)
{
printk("<1>Hello World exit!\n");
}
//子產品的注冊
module_init(hello_init);
module_exit(hello_exit);
2.3 子產品的編譯
obj-m:=hello.o
CURRENT_PATH:=$(shell pwd)
ARM_LINUX_KERNEL:=/opt/FriendlyARM/mini240/linux-2.6.32.2
all:
$(MAKE) -C $(ARM_LINUX_KERNEL) SUBDIRS=$(CURRENT_PATH) modules
clean:
rm -rf *.cmd *.o *.ko *.mod.c *.symvers *.order
編譯後會有hello.ko檔案
将hello.ko檔案傳輸到開發闆上
安裝驅動子產品
insmod hello.ko
解除安裝驅動子產品
rmmod hello
檢視已經安裝的驅動子產品
lsmod