天天看點

linux嵌入式開發

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
           

繼續閱讀