收藏 分享(赏)

S3C6410移植linux教程.docx

上传人:11xg27ws 文档编号:7805789 上传时间:2019-05-26 格式:DOCX 页数:83 大小:1.69MB
下载 相关 举报
S3C6410移植linux教程.docx_第1页
第1页 / 共83页
S3C6410移植linux教程.docx_第2页
第2页 / 共83页
S3C6410移植linux教程.docx_第3页
第3页 / 共83页
S3C6410移植linux教程.docx_第4页
第4页 / 共83页
S3C6410移植linux教程.docx_第5页
第5页 / 共83页
点击查看更多>>
资源描述

1、Linux3.6.7 在 OK6410 平台的移植(一)前言对于我这个新手而言,第一次学习 linux,面对庞大的代码,复杂的程序结构和自身对linux 知识的严重缺乏,一下子还真不知道该做什么。想想开发板厂家提供的演示程序,其过程是这样:先运行 bootloader,bootloade 引导 linux 内核启动,启动后再运行 UI 程序。对应的程序也有三个分别为 u-boot.bin zImage 和 rootfs.yaffs2.最初的想法是 linux 内核启动就是这个 zImage,但这个 rootfs.yaffs 到底是何方妖怪?来这里做甚?初步认为是一个UI(用户界面),后面随着移

2、植的深入,才明白这是一个根文件系统,当然里面包含了 UI的应用程序。好吧,一直在 linux 门外徘徊也不是办法,不管怎样,硬着头皮进去看看再说。于是我决定先编译一个能够启动的 linux 内核,这个内核对于开发板上一些外部设备的驱动先不去管它,主要达到的目的是能够启动。我当时对“启动” 的理解就是能够运行到有一个 shell 界面。后面对文件系统,根文件系统等等概念稍微理解后才明白“启动” 和 shell界面还是两个部分。启动包括 linux 必要的一些初始化,系统的或外部设备的。初始化完成后 linux 还要通过读取某些文件才能够运行 shell 程序。而这些文件就包含在这个rootfs.

3、yaffs2 中(其实 shell 程序也包含在这个文件中 )。这就涉及到几个概念,文件系统,根文件系统,yaffs2 文件系统,yaffs2 根文件系统。在网上稍微了解后,对这几个概念有了初步的理解:linux 内核启动后需要读取的这些文件需要放在某个地方(SDRAM 或者 NANDflash 或者是宿主机的硬盘上)中。放在 SDRAM 中的比如有个ramdisk,它是一个设备,相当于在 SDRAM 中建立了一个“ 硬盘”,里面就放好了这些运行文件(初步印象,未进一步了解);放在 NAND flash 的有 cramfs 或者 yaffs 等等,而cramfs 比较适合用于 Nor flas

4、h 上,yaffs 适合 Nand flash 上;放在宿主机上的有 NFS 根文件系统。那么,yaffs2 文件系统和 yaff2 根文件系统不是一回事吗?想想以前用过STM32 做一些实验时有个 FATFS,好像也是文件系统,当时用这个系统从 SD 卡中读取图片、文档,而 SD 卡首先必须格式化为 FAT32(FAT)类型。yaffs2 文件系统就有点像这个 fatfs,我们把它包含在 linux 程序中意味着 linux 能够采用这种格式去读取一些文件。yaff2 根文件系统就是把包含有 linux 启动必须的脚本和目录的这些文件采用 yaffs2 这种格式打包,然后放在 Nand fl

5、ash 中。简单理解就相当于先把 NAND 的某个区域“ 格式化”为yaffs2 格式,再把这些文件放在 NAND 上面。最初的理解就是这样了,那么,接下来我们要做的事就是先“启动” ,再运行“shell”。Linux3.6.7 在 OK6410 平台的移植(二)编译配置linux3.6.71.修改主目录下 Makefile:ARCH ?= $(SUBARCH)CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:“%“=%)改为:ARCH ?= armCROSS_COMPILE ?= /usr/local/arm/4.5.1/bin/arm-linux-2.arch

6、/arm/mach-s3c64xx 目录下2.1 拷贝个 mach-mini6410.c 重命名为 mach-ok6410.c 并修改其内容:2.1.1 把所有 mini6410 字样都替换为 ok6410,注意是小写2.1.2 把所有 MINI6410 字样都替换为 OK6410,注意是大写2.1.3 修改 static struct mtd_partition ok6410_nand_part /* 0 = .name = “uboot“,.size = SZ_1M,.offset = 0,1 = .name = “kernel“,.size = SZ_2M,.offset = SZ_1M

7、,2 = .name = “rootfs“,.size = MTDPART_SIZ_FULL,.offset = SZ_1M + SZ_2M,*/改为.name = “Bootloader“,.offset = 0,.size = (2 * SZ_1M),.mask_flags = MTD_CAP_NANDFLASH,.name = “Kernel“,.offset = (2 * SZ_1M),.size = (5*SZ_1M) ,.mask_flags = MTD_CAP_NANDFLASH,.name = “File System“,.offset = (7 * SZ_1M),.size

8、= (200*SZ_1M) ,.name = “User“,.offset = MTDPART_OFS_APPEND,.size = MTDPART_SIZ_FULL,2.2 修改 Kconfig 文件,参照 Mini6410 的配置,加入 OK6410 如下:config MACH_OK6410bool “OK6410“select CPU_S3C6410select S3C_DEV_HSMMCselect S3C_DEV_HSMMC1select S3C64XX_SETUP_SDHCIselect S3C_DEV_USB_HOSTselect S3C_DEV_NANDselect S3C_

9、DEV_FBselect S3C64XX_SETUP_FB_24BPPselect SAMSUNG_DEV_ADCselect SAMSUNG_DEV_TShelpMachine support for the FORLINX OK64102.3 修改 Makefile 文件,参照 MINI6410,加入 OK6410 如下:obj-$(CONFIG_MACH_OK6410) += mach-ok6410.o3. 修改 arch/arm/tools/mach-types 文件,加入 OK6410 的 mach-type,这个必须和U-BOOT 中的 MACH-TYPE 一致,这里选用 smdk

10、6410 的 mach-type:1626。如下:ok6410 MACH_OK6410 OK6410 16264.回到主目录下执行 Make menuconfigrootubuntu:/home/my# cd linux-3.6.7/rootubuntu:/home/my/linux-3.6.7# make menuconfig 配置如下:4.1 先选择 Load an Alternate Configuration File,输入arch/arm/configs/s3c6400_defconfig4.2 选择 General Setup,打开 Cross_compiler tool perf

11、ix,输入/usr/local/arm/4.5.1/bin/arm-linux-4.3 选择 System Type,取消 SMDK6400 ,Abreak;找到 if (!chip-ecc.strength) pr_warn(“Driver must set ecc.strength when using hardware ECCn“);BUG();把 BUG();屏蔽掉4.主目录下 make menuconfig:找到 Device Drivers Memory Technology Device (MTD) support -NAND Device Support - 取消 NAND s

12、upport for Samsung S3C24xx S3C64xx ,选择 NAND support for Samsung S3C64xx S5P64xx保存后退出然后 make uImage,烧写后运行如下:Starting kernel .Uncompressing Linux. done, booting the kernel.Booting Linux on physical CPU 0Linux version 3.6.7 (rootubuntu) (gcc version 4.5.1 (ctng-1.8.1-FA) ) #3 Mon Dec 3 21:15:19 CST 201

13、2CPU: ARMv6-compatible processor 410fb766 revision 6 (ARMv7), cr=00c5387dCPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cacheMachine: OK6410Memory policy: ECC disabled, Data cache writebackCPU S3C6410 (id 0x36410101)S3C24XX Clocks, Copyright 2004 Simtec Electronicscamera: no p

14、arent clock specifiedS3C64XX: PLL settings, A=533000000, M=533000000, E=24000000S3C64XX: HCLK2=266500000, HCLK=133250000, PCLK=66625000 mout_apll: source is fout_apll (1), rate is 533000000mout_epll: source is epll (1), rate is 24000000mout_mpll: source is mpll (1), rate is 533000000usb-bus-host: so

15、urce is clk_48m (0), rate is 48000000audio-bus: source is mout_epll (0), rate is 24000000audio-bus: source is mout_epll (0), rate is 24000000audio-bus: source is mout_epll (0), rate is 24000000irda-bus: source is mout_epll (0), rate is 24000000camera: no parent clock specifiedCPU: found DTCM0 8k 000

16、00000, not enabledCPU: moved DTCM0 8k to fffe8000, enabledCPU: found DTCM1 8k 00000000, not enabledCPU: moved DTCM1 8k to fffea000, enabledCPU: found ITCM0 8k 00000000, not enabledCPU: moved ITCM0 8k to fffe0000, enabledCPU: found ITCM1 8k 00000000, not enabledCPU: moved ITCM1 8k to fffe2000, enable

17、dBuilt 1 zonelists in Zone order, mobility grouping on. Total pages: 65024Kernel command line: noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200PID hash table entries: 1024 (order: 0, 4096 bytes)Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)Inode-ca

18、che hash table entries: 16384 (order: 4, 65536 bytes)Memory: 256MB = 256MB totalMemory: 256772k/256772k available, 5372k reserved, 0K highmemVirtual kernel memory layout:vector : 0xffff0000 - 0xffff1000 ( 4 kB)DTCM : 0xfffe8000 - 0xfffec000 ( 16 kB)ITCM : 0xfffe0000 - 0xfffe4000 ( 16 kB)fixmap : 0xf

19、ff00000 - 0xfffe0000 ( 896 kB)vmalloc : 0xd0800000 - 0xff000000 ( 744 MB)lowmem : 0xc0000000 - 0xd0000000 ( 256 MB)modules : 0xbf000000 - 0xc0000000 ( 16 MB).text : 0xc0008000 - 0xc02828ec (2539 kB).init : 0xc0283000 - 0xc029db94 ( 107 kB).data : 0xc029e000 - 0xc02ca7c0 ( 178 kB).bss : 0xc02cb024 -

20、0xc02fc0c4 ( 197 kB)SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1NR_IRQS:246VIC f6000000: id 0x00041192, vendor 0x41VIC f6010000: id 0x00041192, vendor 0x41sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 4294967286msConsole: colour dummy device 80x30Calib

21、rating delay loop. 353.89 BogoMIPS (lpj=1769472)pid_max: default: 32768 minimum: 301Mount-cache hash table entries: 512CPU: Testing write buffer coherency: okSetting up static identity map for 0x501ddc68 - 0x501ddcc4DMA: preallocated 256 KiB pool for atomic coherent allocationsOK6410: Option string

22、ok6410=0OK6410: selected LCD display is 480x272s3c64xx_dma_init: Registering DMA channelsPL080: IRQ 73, at d0846000, channels 08PL080: IRQ 74, at d0848000, channels 816S3C6410: Initialising architecturebio: create slab at 0usbcore: registered new interface driver usbfsusbcore: registered new interfa

23、ce driver hubusbcore: registered new device driver usbROMFS MTD (C) 2007 Red Hat, Inc.io scheduler noop registeredio scheduler deadline registeredio scheduler cfq registered (default)start plist testend plist tests3c-fb s3c-fb: window 0: fbSerial: 8250/16550 driver, 4 ports, IRQ sharing disableds3c6

24、400-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 69) is a S3C6400/10console ttySAC0 enableds3c6400-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 70) is a S3C6400/10s3c6400-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 71) is a S3C6400/10s3c6400-uart.3: ttySAC3 at MMIO 0x7f005c00 (irq = 72) is a S3C6400/10brd:

25、module loadedloop: module loadedS3C NAND Driver, (c) 2008 Samsung ElectronicsNandFlash is busying.forlinx nandflash dev_id=d5forlinx*Nandflash:ChipType= MLC ChipName=samsung-K9GAG08U0D*S3C NAND Driver is using hardware ECC.NAND device: Manufacturer ID: 0xec, Chip ID: 0xd5 (Samsung NAND 2GiB 3,3V 8-b

26、it), page size: 4096, OOB size: 218Driver must set ecc.strength when using hardware ECCCreating 4 MTD partitions on “NAND 2GiB 3,3V 8-bit“:0x000000000000-0x000000200000 : “Bootloader“0x000000200000-0x000000700000 : “Kernel“0x000000700000-0x00000cf00000 : “File System“0x00000cf00000-0x000080000000 :

27、“User“ohci_hcd: USB 1.1 Open Host Controller (OHCI) Drivers3c2410-ohci s3c2410-ohci: S3C24XX OHCIs3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1s3c2410-ohci s3c2410-ohci: irq 79, io mem 0x74300000s3c2410-ohci s3c2410-ohci: init err (00000000 0000)s3c2410-ohci s3c2410-ohci: c

28、ant start s3c24xxs3c2410-ohci s3c2410-ohci: startup error -75s3c2410-ohci s3c2410-ohci: USB bus 1 deregistereds3c2410-ohci: probe of s3c2410-ohci failed with error -75mousedev: PS/2 mouse device common for all micei2c /dev entries driversdhci: Secure Digital Host Controller Interface driversdhci: Co

29、pyright(c) Pierre Ossmans3c-sdhci s3c-sdhci.0: clock source 0: mmc_busclk.0 (133250000 Hz)s3c-sdhci s3c-sdhci.0: clock source 2: mmc_busclk.2 (24000000 Hz)mmc0: SDHCI controller on samsung-hsmmc s3c-sdhci.0 using ADMAs3c-sdhci s3c-sdhci.1: clock source 0: mmc_busclk.0 (133250000 Hz)s3c-sdhci s3c-sdh

30、ci.1: clock source 2: mmc_busclk.2 (24000000 Hz)mmc0: mmc_rescan_try_freq: trying to init card at 400000 Hzmmc0: mmc_rescan_try_freq: trying to init card at 300000 Hzmmc1: SDHCI controller on samsung-hsmmc s3c-sdhci.1 using ADMAmmc0: mmc_rescan_try_freq: trying to init card at 200000 Hzusbcore: regi

31、stered new interface driver usbhidusbhid: USB HID core driverVFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5drivers/rtc/hctosys.c: unable to open rtc device (rtc0)VFS: Cannot open root device “mtdblock2“ or unknown-block(0,0): error -19Please append a correct “root=“ boot opt

32、ion; here are the available partitions:Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) (unwind_backtrace+0x0/0xf0) from (panic+0x8c/0x1dc) (panic+0x8c/0x1dc) from (mount_block_root+0x1dc/0x2a0) (mount_block_root+0x1dc/0x2a0) from (prepare_namespace+0x160/0x1b8) (prepar

33、e_namespace+0x160/0x1b8) from (kernel_init+0x168/0x1b0) (kernel_init+0x168/0x1b0) from (kernel_thread_exit+0x0/0x8)可以看到红色部分表示 NAND 驱动已经改好了。内核没有运行起来说明后面还缺少文件系统。Linux3.6.7 在 OK6410 平台的移植(四)搭建YAFFS2 根文件系统1. 内核加入 YAFFS2 文件系统,编译参考前面这篇: Linux3.6.7 在 OK6410 平台的移植(三)NAND HWECC 8BIT 驱动2. make menuconfig 配置如下

34、:2.1Device Drivers 配置2.1.1. Generic Driver Options 选择* Maintain a devtmpfs filesystem to mount at /dev * Automount devtmpfs at /dev, after the kernel mounted the 2.1.2 MTDCaching block device access to MTD devices2.2File Systems 配置取消 Second extended fs support 和 Ext3 journalling file system support*

35、 Miscellaneous filesystems -选择2.3 Boot options 配置输入“noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200“3.制作 mkyaffs2image 工具进入 yaffs2 源码目录下 utils 目录,修改 mkyaff2image.c:#define chunkSize 2048#define spareSize 64#define pagesPerBlock 64改为#define chunkSize 4096#define sp

36、areSize 218#define pagesPerBlock 128进入 yaffs2 源码目录下 direct 目录,修改 yportenv.h增加#define CONFIG_YAFFS_DEFINES_TYPES保存后 make,这时就在 utils 目录生产 mkyaffs2image 文件,把这个文件拷贝到/usr/bin 目录下4.制作根文件系统下面写的过程大部分是参考这篇文章:http:/ 解压 busybox1.20.2,修改 MakefileCROSS_COMPILE ?=/usr/local/arm/4.5.1/bin/arm-linux-ARCH ?= arm4.2

37、配置 busybox 菜单如下:a、make defconfig(默认配置)b、make menuconfigBusybox Settings -Build Options -(/usr/local/arm/4.5.1/bin/arm-linux-) Cross Compiler prefixBusybox Settings -General Configuration -* Dont use /usr 4.3 编译、安装a、makeb、make install(由于前面没设置安装位置将默认安装在本文件夹的_install 文件夹下)4.4 进入_install 建立其他根文件系统文件夹. 我

38、写了个脚本 creat_initramfs.sh#!/bin/shecho “-Create root,dev“mkdir root dev etc bin sbin mnt sys proc lib home tmp var usrmkdir usr/sbin usr/bin usr/lib usr/modules usr/etcmkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.dmkdir lib/moduleschmod 1777 tmpsudo mknod -m 600 dev/console c 5 1sudo mknod -m 666 dev/n

39、ull c 1 3echo “-make direction done-“然后保存脚本修改权限:chmod +x creat_initramfs.sh运行脚本!4.5 建立相关文件4.5.1 在 etc 目录下创建 profile 文件,内容如下# Ash profile# vim: syntax=sh# No core files by defaultulimit -S -c 0 /dev/null 2if (need_skip 0) printf (“Attempt to write outside the flash arean“);*length = 0;return -EINVAL;

40、if (!need_skip elserval = nand_write (nand, offset, length, buffer);if (rval = 0)return 0;*length = 0;printf (“NAND write to offset %llx failed %dn“,offset, rval);return rval;红色部分是我后面加上去的。修改后把这三个文件写到 NAND 中,启动后运行如下:# Booting kernel from Legacy Image at 50008000 .Image Name: Linux-3.6.7Image Type: AR

41、M Linux Kernel Image (uncompressed) Data Size: 1410288 Bytes = 1.3 MiBLoad Address: 50008000Entry Point: 50008040Verifying Checksum . OKXIP Kernel Image . OKOKStarting kernel .Uncompressing Linux. done, booting the kernel.Booting Linux on physical CPU 0Linux version 3.6.7 (rootubuntu) (gcc version 4.5.1 (ctng-1.8.1-FA) ) #17 Mon Dec 3 00:30:47 CST 2012CPU: ARMv6-compatible processor 410fb766 revision 6 (ARMv7), cr=00c5387dCPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cacheMachine: OK6410Memory policy: ECC disabled, Data cache writeback

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报