天天看點

linux2.6.30.4移植到TQ2440

http://blog.chinaunix.net/uid-28194872-id-3358090.html

修改根目錄下的Makefile檔案

指令:gedit Makefile大概193行和194行

修改:

ARCH=arm

CROSS_COMPILE=arm-linux-

原因:指明體系結構為arm,采用的交叉編譯器為arm-linux-,這一步一定要改完再執行make menuconfig,否則,用的是x86的make,打開的配置單不是arm的。

修改平台輸入時鐘

指令:gedit arch/arm/mach-s3c2440/mach-smdk2440.c 162行或163行

修改:static void _initsmdk2440_map_io()函數中的s3c24xx_init_clocks(16924400改為)s3c24xx_init_clocks(12000000)

原因:tq2440使用12MHz外部時鐘輸入

修改機器碼

指令:gedit arch/arm/tools/mach-types 379行

修改:s3c2440一行最後的數字改為168

原因:在核心檔案arch/arm/mach-s3c2440/mach-smdk2440.c中的 MACHINE_START(S3C2440,”SMDK2440”)中要使用該機器碼,同時它還應該與uboot中的機器碼一緻

制作配置單

指令:make menuconfig

原因:一開始核心不存在.config檔案,無法進行編譯,隻有使用者按自己需求配置好核心并儲存配置單為.config後,才可編譯。

下面分别描述核心加入的配置。

首先加載核心提供的預設配置單,以減少核心配置的工作量。在彈出的配置界面中,選擇Load an Alternate Configuration File,加載預設配置arch/arm/configs/s3c2410_defconfig

該配置單按照arm體系結構添加了一些配置,但有一些是我們不需要的或者是需要修改的,在此基礎上進行進一步的配置。

General setup,該配置單下包括了核心的一些基本設定,配置時加入的功能有

System V IPC:支援system V的程序間通信對象;

Classic RCU:經典RCU(read-copy-update)支援,這是一種進階互斥機制;

(17) Kernel log buffer size (16 => 64KB, 17 => 128KB):核心日志緩沖區大小為128kb;

Optimize for size:核心大小優化,在編譯時采用-O2;

Choose SLAB allocator (SLUB (Unqueued Allocator)):采用高速緩存管理(slab配置設定器)的進階版本SLUB;

Enable loadable module support,該配置單設定是否使用子產品加載,在本配置單下選擇:

Module unloading:子產品可解除安裝,使得子產品可以随時解除安裝和添加,當然一些不允許解除安裝的子產品除外。

Enable the block layer,這個選項不選,因為裝置中沒有塊裝置,不需要使用塊裝置層,NAND flash直接通過IO口和幾個控制引腳控制,也不需要塊裝置層。

System Type:該項是一些與平台相關的選項,選擇以下幾項:

ARM system type (Samsung S3C2410, S3C2412, S3C2413, S3C2440,S3C2443):選擇所支援的ARM類型,這裡針對開發闆選擇支援三星S3C2410, S3C2412, S3C2413, S3C2440,S3C2443。

ADC common driver support:與ADC與觸摸屏驅動有關,選上;

Force UART FIFO on during boot process:在核心解壓時保持序列槽打開,可用于檢測核心解壓的情況;

(0) S3C UART to use for low-level messages:選擇輸出底層資訊的序列槽,根據開發闆情況,選擇0号序列槽;

(0) Space between gpio banks:設定GPIO bank之間的空間,用于防止通路越界,選擇後會占用一部分存儲空間,這個設定為0,注意編寫程式,一般不會越界,可以節省存儲空間;

S3C2440 Machines

SMDK2440

SMDK2440 with S3C2440 CPU module

選擇S3C2440 Machines下的這兩項,使得核心支援SMDK2440,SMDK2440是三星公司的官方設計參考,一般都采用這種參考。

Bus support:該選項選擇總線類型,這個不選,沒有合适的。

Kernel Features:該選項設定内和特性,選擇以下幾項:

Memory split (3G/1G user/kernel split):記憶體配置設定,一般保持該預設配置,即1G給核心空間,3G給使用者空間;

Use the ARM EABI to compile the kernel:采用EABI技術編譯核心,由于我們的交叉編譯器支援EABI,選擇該項;

(4096) Low address space to protect from user allocation:設定低端記憶體大小,按預設。

Boot options:引導時的相關選項,保持預設。

CPU Power Management:CPU電源管理,保持預設。

Floating point emulation:浮點仿真,保持預設。

Userspace binary formats:使用者空間二進制模式,這裡選擇

Kernel support for ELF binaries,即采用ELF格式,ELF是可執行連接配接格式,是UNIX系統實驗室作為應用程式二進制接口而開發和釋出的。

Power management options:電源管理選項,這裡不選,我們的裝置要保持長時間工作,無需睡眠。

Networking support:網絡設定,選擇配置如下:

Networking options->

Unix domain sockets:使用UNIX套接字;

TCP/IP networking:TCP/IP網絡;

IP: kernel level autoconfiguration:核心自動配置IP;

IP: DHCP support :允許本機根檔案系統通過NFS(網絡檔案系統)挂載到其他計算機上,實作遠端通路。

Wireless:無線設定,暫時保持預設,以後修改。

Device Drivers:裝置驅動,保持預設,做驅動時會進行修改。

File systems:檔案系統配置,選擇内容如下:

DOS/FAT/NT Filesystems->

VFAT (Windows-95) fs suppor:支援挂載windows的檔案系統;

(437) Default codepage for FAT:設定FAT檔案系統允許代碼頁大小;

(iso8859-1) Default iocharset for FAT:設定FAT檔案系統采用的字元類型。

Pseudo filesystems->

Virtual memory file system support (former shm fs):采用虛拟記憶體檔案系統(Tmpfs);

Userspace-driven configuration filesystem:使用configfs,該檔案系統與sysfs功能相反。

Miscellaneous filesystems:這個先不做選擇,制作yaffs2檔案系統後再處理。

Network File Systems->

NFS client support->

NFS client support for NFS version 3:使用第三版NFS;

Root file system on NFS:允許通過NFS挂載根檔案系統。

Partition Types:劃分類型,這裡不選擇。

Native language support->

(iso8859-1) Default NLS Option;

Codepage 437 (United States, Canada)

Simplified Chinese charset (CP936, GB2312)

NLS ISO 8859-1 (Latin 1; Western European Languages)

NLS UTF-8

給出了支援的語言及字元集類型

Kernel hacking:該項大部分是便于核心開發使用的,選擇以下幾項:

(1024)Warn for stack frames larger than (needs gcc 4.4):設定堆棧報警極限大小;

S3C UART to use for low-level debug:底層是用的UART端口号。

Security options:不做配置。

Cryptographic API:一些加密和校驗碼的設定,選擇如下:

Cryptographic algorithm manager:啟用加密技術必須選擇這項;

ECB support:ECB支援;

CRC32c CRC algorithm:啟用CRC32c算法;

AES cipher algorithms:啟用AES加密算法;

ARC4 cipher algorithm:啟用ARC4加密算法;

Hardware crypto devices:啟用硬體加密裝置;

Library routines:一些庫函數選擇,選擇如下:

CRC ITU-T V.41 functions

CRC32 functions

CRC7 functions

這樣,整個配置過程結束,選擇Save an Alternate Configuration File,儲存為.config即可。現在在根目錄下使用make zImage即可編譯出核心鏡像,但為了友善,作些改動。在根目錄下使用指令gedit arch/arm/boot/Makefile,進入該目錄下的Makefile檔案,在58行,

修改如下

$(obj)/zImage: $(obj)/compressed/vmlinux FORCE

$(call if_changed,objcopy)

@cp -f arch/arm/boot/zImage zImage.bin

@echo ' Kernel: $@ is ready'

這個指令就是将arch/arm/boot/目錄下的zImage檔案複制到根目錄下,并重命名為zImage.bin,因為直接使用make zImage指令後zImage預設在arch/arm/boot/目錄下,為了友善操作,加入該指令可将鏡像複制到根目錄下。

然後,修改根目錄下的Makefile檔案 , 在1255行如下:

distclean: mrproper

@find $(srctree) $(RCS_FIND_IGNORE) \

\( -name '*.orig' -o -name '*.rej' -o -name '*~' \

-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \

-o -name '.*.rej' -o -size 0 \

-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \

-type f -print | xargs rm –f rm -f zImage.bin

該指令是為執行make distclean清除檔案時添加了一條清除任務,即将複制到根目錄下的zImage.bin也清除掉。

最後,執行make zImage,編譯出核心鏡像。由于此時未驅動NAND flash,也沒有加載檔案系統,燒寫進開發闆以後會顯示未挂載檔案系統,這進一步說明是正确的。

下面對NAND flash進行分區和進行相應的配置。

首先為核心支援NAND flash添加新的配置選項:

Device Drivers->

Memory Technology Device (MTD) support->啟用MTD支援,這是使用NAND flash的前提,也是使用JAFFS2檔案系統的前提

MTD partitioning support:我們要對NAND flash進行分區,選中這一項;

Direct char device access to MTD devices:允許字元裝置通路MTD裝置;

Common interface to block layer for MTD 'translation layers':塊裝置層向MTD傳輸層接口,該項預設必須選上。

Caching block device access to MTD devices:允許緩存塊裝置通路MTD裝置,JAFFS2為檔案系統服務。

NAND Device Support->

NAND Flash support for S3C2410/S3C2440 SoC 使核心支援S3C2440 NAND flash

S3C2410 NAND Hardware ECC 采用S3C2410的硬體ECC

設定完畢,退出儲存配置單。

指令:gedit arch/arm/plat-s3c24xx/common-smdk.c +109

修改内容如下:

static struct mtd_partition smdk_default_nand_part[] = {

[0] = {

.name = "Rojian2440_Boot",

.size = 0x00040000,

.offset = 0x00000000,

},

[1] = {

.name = "Rojian2440_Param",

.offset = 0x00040000,

.size = 0x00020000,

},

[2] = {

.name = "Rojian2440_Kernel",

.offset = 0x00200000,

.size = 0x00300000,

},

[3] = {

.name = "Rojian2440_Yaffs2",

.offset = 0x00500000,

.size = MTDPART_SIZ_FULL,

}

};

然後,修改同檔案的下面的代碼

static struct s3c2410_platform_nand smdk_nand_info = {

.tacls = 10,

.twrph0 = 25,

.twrph1 = 10,

.nr_sets = ARRAY_SIZE(smdk_nand_sets),

.sets = smdk_nand_sets,

};

其中修改的值的确定,由NAND flash晶片手冊查詢相關資料,經計算得到,如下(其中HCLK=100Hz):

tacls>CLE或ALE建立時間最小值*HCLK

twrph0>nWE或nRE的持續時間最小值*HCLK-1

twrph1>寫資料起作用時間*HCLK-1

最後,修改drivers/mtd/nand/s3c2410.c 669行中s3c2410_nand_init_chip函數的語句

chip->ecc.mode = NAND_ECC_NONE

這裡不采用NAND flash的軟體ECC校驗碼,因為在初始化的時候,uboot中有校驗碼,然後在後面yaffs2檔案系統移植的時候,要選上采用S3C2440硬體校驗碼。

序列槽驅動移植

修改核心源碼arch/arm/mach-s3c2440/mach-smdk2440.c 檔案的第99行:

·ulcon = 0x03,

然後修改drivers/serial/samsung.c 第53行

if(port->line == 2)

{

s3c2410_gpio_cfgpin(S3C2410_GPH6, S3C2410_GPH6_TXD2);

s3c2410_gpio_pullup(S3C2410_GPH6, 1);

s3c2410_gpio_cfgpin(S3C2410_GPH7, S3C2410_GPH7_RXD2);

s3c2410_gpio_pullup(S3C2410_GPH7, 1);

}

然後在修改.dev_name = "tq2440_serial",

修改了裝置名。

添加配置單内容如下:

linux2.6.30.4移植到TQ2440

DM9000EP網卡驅動移植:

gedit arch/arm/mach-s3c2440/mach-smdk2440.c 添加頭檔案

#include <linux/dm9000.h>

//如下代碼置于platform_device _initdata *smdk_devs[] 數組前

static struct resource s3c_dm9k_resource[] = {

[0] = {

.start = S3C2410_CS4,

.end = S3C2410_CS4+3,

.flags = IORESOURCE_MEM,

},

[1] = {

.start = S3C2410_CS4+4,

.end = S3C2410_CS4+4+3,

.flags = IORESOURCE_MEM,

},

[2] = {

.start = IRQ_EINT7,

.end = IRQ_EINT7,

.flags = IORESOURCE_IRQ |IRQF_TRIGGER_RISING,

}

};

static struct dm9000_plat_data s3c_device_dm9k_platdata = {

.flags= DM9000_PLATF_16BITONLY

};

struct platform_device s3c_device_dm9000 = {

.name= "dm9000",

.id= 0,

.num_resources= ARRAY_SIZE(s3c_dm9k_resource),

.resource= s3c_dm9k_resource,

.dev= {

.platform_data = &s3c_device_dm9k_platdata,

}

};

static struct platform_device *smdk2440_devices[] __initdata = {

&s3c_device_usb,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c0,

&s3c_device_iis,

&s3c_device_dm9000,

};

修改 gedit drivers/net/dm9000.c 在頭檔案處添加如下紅色的代碼

#include "dm9000.h"

#if defined(CONFIG_ARCH_S3C2410)

#include <mach/regs-mem.h>

#endif

修改static int __devinit dm9000_probe(struct platform_device *pdev)函數如下所示,

該函數大概位置1276行,需要修改的大概位置為1460行

db->mii.reg_num_mask = 0x1f;

db->mii.force_media = 0;

db->mii.full_duplex = 0;

db->mii.dev = ndev;

db->mii.mdio_read = dm9000_phy_read;

db->mii.mdio_write = dm9000_phy_write;

#if defined(CONFIG_ARCH_S3C2410)

printk("Now use the default MAC address: 10:23:45:67:89:ab\n");

mac_src = "tq2440";

ndev->dev_addr[0] = 0x10;

ndev->dev_addr[1] = 0x23;

ndev->dev_addr[2] = 0x45;

ndev->dev_addr[3] = 0x67;

ndev->dev_addr[4] = 0x89;

ndev->dev_addr[5] = 0xab;

#else

mac_src = "eeprom";

for (i = 0; i < 6; i += 2)

dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);

if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {

mac_src = "platform data";

memcpy(ndev->dev_addr, pdata->dev_addr, 6);

}

if (!is_valid_ether_addr(ndev->dev_addr)) {

mac_src = "chip";

for (i = 0; i < 6; i++)

ndev->dev_addr[i] = ior(db, i+DM9000_PAR);

}

if (!is_valid_ether_addr(ndev->dev_addr))

dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "

"set using ifconfig\n", ndev->name);

#endif(此處不能設定顔色,不知道怎麼回事,這句是要添加的,對應上面的借束語句)

修改dm9000_init(void)函數如下所示,大概位置1590行

static int __init dm9000_init(void)

{

#if defined(CONFIG_ARCH_S3C2410)

unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;

unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;

*((volatile unsigned int *)S3C2410_BWSCON) =

(oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;

*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;

#endif

printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);

return platform_driver_register(&dm9000_driver);

}

編譯選項Device Drivers --->Network device support ---> Ethernet (10 or 100Mbit) --->,

<*>DM9000 Surport,

編寫如下測試檔案

#vi net_set

ifconfig eth0 hw ether 10:23:45:67:89:ab

#ifconfig eth0 闆子的ip位址 netmask 子網路遮罩 up

ifconfig eth0 172.18.25.15 netmask 255.255.255.0 up

#route add default gw 網關

route add default gw 172.18.25.254

#如下顯示的是調試資訊,可以不要

echo ifconfig eth0 hw ether 10:23:45:67:89:ab >/dev/console

echo ifconfig eth0 172.18.25.15 netmask255.255.255.0 up >/dev/console

echo route add default gw 172.18.25.254 >/dev/console

存放改檔案到

/etc/init.d/net_set

#chmod +x net_set

運作之,即可以看到如下資訊

eth0: link up, 100Mbps, full-duplex, lpa 0x45E1,

繼續測試,輸入ping指令,拼區域網路的一個主機172.18.25.9

#ping 172.18.25.9

PING 172.18.25.9 (172.18.25.9): 56 data bytes

64 bytes from 172.18.25.9: seq=0 ttl=64 time=2.128 ms

64 bytes from 172.18.25.9: seq=1 ttl=64 time=0.934 ms

64 bytes from 172.18.25.9: seq=2 ttl=64 time=0.939 ms

64 bytes from 172.18.25.9: seq=3 ttl=64 time=0.937 ms

64 bytes from 172.18.25.9: seq=4 ttl=64 time=0.867 ms

64 bytes from 172.18.25.9: seq=5 ttl=64 time=0.938 ms

64 bytes from 172.18.25.9: seq=6 ttl=64 time=0.942 ms

..............

說明移植成功

實作自啟動net_set

修改inittab可以實作該功能

#vi /etc/inittab

在其中添加如下代碼

::sysinit:/etc/init.d/net_set