Click here to load reader
Upload
sorley
View
209
Download
14
Embed Size (px)
DESCRIPTION
嵌入式系统讲义 第 6 章 嵌入式系统软件移植与 Linux 下程序开发. 周国运 2007.9. 本章主要内容. 1 、 Bootloader 及 vivi 移植 2 、嵌入式 Linux 内核及移植 3 、基于 Linux 的应用程序开发 4 、基于 Linux 的驱动程序开发 5 、驱动程序开发实例. 6.1 Bootloader 及 vivi 移植. 本节内容 1 、 Bootloader 简介 2 、 Bootloader 工作模式 3 、 Bootloader 启动过程 4 、 vivi Bootloader 源代码分析 - PowerPoint PPT Presentation
Citation preview
6 Linux
2007.9
1Bootloadervivi2Linux3Linux4Linux5
6.1 Bootloader vivi
1Bootloader2Bootloader 3Bootloader4vivi Bootloader5vivi Bootloader6vivi
Bootloader///kernel//Cramfs
6.1.1 BootloaderBootloaderPCBIOS Bootloader Bootloader
Bootloader
Bootloader
Boot parameters
Kernel
Root filesystem
Bootloader0x0000,0000BootloaderBootloaderBootloaderBootloaderviviRedBootU-Boot
Bootloader1viviviviMiziBootloaderARM92RedBoot RedBoot(Red Hat)/3U-Boot U-BootUniversal BootloaderDENXBootloaderARMPowerPCMIPS
6.1.2 Bootloader BootloaderBootloader
1BootloadingAutonomousBootloader RAM BootloaderBootloader
2DownloadingBootloaderBootloaderRAM BootloaderFLASH
BootloaderBootloader RedBootRedBoot>vivi Bootloader vivi>
2Downloading
RedBootBootloaderRedBootU-BootBootloaderRedBoot3RedBoot Linux
6.1.3 BootloaderBootloader11CPU5(1) Bootloader 2 kernel
CPU /cache
(2)2RAM 2 RAM RAM24KB 1MBRAM
(3)2RAM(4)sp1MB RAM ()(5)2C Bootloader stage2
Bootloader2RAM
stage1stage2RAM1MB
...
...
...
Flash
ramdisk
...(blank)
...(blank)
stage21MB
stage11MB
RAM
...(blank)
spstage_end-4
stage2_start
0x0001,0000(64KB)
0x0000,0400(1KB)
0x0000,0000
22C5(1) I/O
(2)(memory map) RAM RAM(3)kernelflashRAM
(4)kernelLinux 2.4.x (tagged list)ATAG_COREATAG_NONE Linux Boot Loader ATAG_COREATAG_MEMATAG_NONE
(5)BootloaderLinux kernel1)CPUR00R1IDR2RAM ( linux/arch/arm/tools/mach-types)2)CPU CPUSVC(IRQsFIQs)3) MMU CacheMMU Cache Cache
6.1.4 vivi BootloaderviviMiziBootloaderARM9viviviviPress Return to start the Linux now, any other key for viviLinux OSvivivivi
viviviviarchDocumentationdriversinitincludelibscriptstestutil103001archarchitectureCPUviviCPUS3C2410x
2Documentationvivi3driversMTDxmodemymodem4includeS3C2410S3C2410
5initmain.cversion.cvivimain.cvivi6libtime.cheap.c7scriptsmenuconfigconfigue
8CVSCVS
vivi
vivi1vivi/arch/s3c2410/head.s2mainLDRSP,DW_STACK_STARTMOVFP,#0MOVA2,#0BLMAINMOVPC,#FLASH_BASE3vivi/init/main.c
6.1.5 vivi Bootloadervivi viviPress Return to start the Linux now, any other key for viviEntervivi5
1load---FlashRAMload [| ] media_typeFlashRAMpartnameaddr sizex|y|zxxmodemyymodemzzmodemvivixmodem
1vivi>load flash kernel xzImageflashxmodem2vivi>load flash 0x80000 0xc0000 x
2part---MTDMTDpart showpart del part resetpart saveflash
part add partnameoffsetsizeflagJFFS2LOCKEDBONFS
3param--- param showparam set boot_delay n(s)param set xmodem_initial_timeout m (s)
4boot---boot [media_type] [| < size>]media_typeflashRAMpartnameaddrsizebootkernelkernel
1vivi>boot nand 0x80000nand flash0x800000xc00002vivi>boot nor 0x80000
5flash---flash
flashflash erase [| ]flashflash erase 0x80000 0xc0000
vivi
6.1.6 viviviviviviviviviviviviviviLinux
Linux:
cygwinfriendly-arm crosstool kernel vivi
1vivi/Makefile11CROSS_COMPILE=/opt/host/armv4l/bin/armv4l-unknown-linux-CROSS_COMPILE= arm-linux-gcc CROSS_COMPILE =/friendly-arm/ crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/bin/arm-linux-
2ARM_GCC_LIBS=/opt/host/armv4l/bin/gcc-lib/armv4l-unknown-linux/2.95.2ARM_GCC_LIBS=ARM_GCC_LIBS= /friendly-arm/ crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/lib/gcc-lib/arm-linux/2.95.3
3 LIBC_INCLUDE_DIR=includeLIBC_INCLUDE_DIR= /friendly-arm/ crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/include
2Linux LinuxLINUX_INCLUDE_DIR=/opt/host/armv4l/includeLINUX_INCLUDE_DIR=LINUX_INCLUDE_DIR=/friendly-arm/kernel/include
2vivi/friendly-arm/vivi/include/platform/smdk2410.hsmdk2410.hI/OUARTvivi
3Nor Flashvivi/arch/s3c2410/smdk.c1 Nor flashNor flashNand flashSDRAM Nor flash12MBbootloaderNand flash SDRAMNor flash
vivi/arch/s3c2410/smdk.cNor flash#ifdef CONFIG_S3C2410_AMD_BOOTmtd_partition_t default_mtd_partitions[] = {{name:"vivi",offset:0,size:0x00020000,flag:0},
{name:"param",offset:0x00020000,size:0x00010000,flag:0}, {name:"kernel",offset:0x00030000,size:0x000C0000,flag:0},
{name:"root",offset:0x00100000,size:0x00140000,flag:MF_BONFS}};#endif
2Nand flashLinuxNor flashLinux
#ifdef CONFIG_S3C2410_NAND_BOOTChar Linux_cmd[ ] = "noinitrd root=/dev/bon/2 init =/linuxrc console=tty1console=ttyS0";#elseChar Linux_cmd[ ] = "noinitrd root=/dev/mtdblock/3init =/linuxrc console=tty1 console=ttyS0";
noinitrdramdiskrootMTDinitconsolettyS0tty0LCDLinuxKernel/Documentatio/kernel-parameters.txt
4load flash jNandJTAGSDRAM0x30000000load flashjvivikernelroot3X-Modem Y-ModemJ-Modem3
1 vivi/include/priv_data.h#define X_MODEM1#define Y_MODEM2#define Z_MODEM3#define JTAG_D4
2 vivi/lib/load_file.cJ-Modemmodem_is(const char *mt){} else if (strncmp("z", mt, 1) == 0) return Z_MODEM; else return UNKNOWN_MODEM;}
modem_is(const char *mt){} else if (strncmp("z", mt, 1) == 0) return Z_MODEM; else if (strncmp(J", mt, 1) == 0) return JTAG_D; else return UNKNOWN_MODEM;}SDRAM
vivivivimenuconfigmakemenuconfigvivi
vivivivi makecleanmake make cleanvivivivi.bin
viviJTAGviviNor flash0x00000---0x20000vivi
6.2 Linux
1Linux2Linux3Linux4Linux
6.2.1 LinuxLinux
LinuxLinuxLinuxLinuxmakefile
Linux
Linux1270011000120MBLinuxarchdriversfsincludeinitipckernellibmmnet1archarchARMPCi386
bootkernellibmmmath-emuFPU2drivers
3fsLinux4includelinux5initmain.cversion.c
6ipc7kernelarch/***/kernel8lib9mmarch/***/mm
10net11DocumentationscriptsdependMakefiledependMakefile
6.2.2 Linux/my-arm/kernel$KERNELCODE=/my-arm/kernel/my-arm/kernel---
MakefileLinuxvmlinuxMakefileMakefile
1ARCH :=$(shell uname m|sed e s/i.86/i.386ARCH :=arm2CROSS_COMPILE = CROSS_COMPILE = /friendly-arm/ crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/bin/arm-linux-
3TOPDIRTOPDIR := $(shell bin/pwd) TOPDIR := $(/my-arm/kernel)4exportINSTALL_MOD_PATHINSTALL_MOD_PATH = /root INSTALL_MOD_PATH = /my-arm/kernel/arch/arm/root
arch/arm1Makefileifeq($(CONFIG_ARCH_S3C2410),y)TEXTADDR=0xC0008000MACHINE=s3c2410endifTEXTADDRimage.ram0xC00080000xC000000032MB
2config.inconfig.inmenuconfigconfig.in2.4.18S3C2410x1CONFIG_ARCH_S3C2410if[$CONFIG_ARCH_S3C2410=y];thencomment S3C2410 Implementationdep_bool SMDK (MERI TECH BOARD)CONFIG_S3C2410_SMCK $CONFIG_ARCH_S3C2410fi
2:if[$CONFIG_FOOTBRIDGE_HOST=y o\$CONFIG_ARCH_SA1100=y]; then$CONFIG_ARCH_S3C410=y o \
arch/arm/boot1Makefileifeq($(CONFIG_ARCH_S3C2410),y)ZTEXTADDR=0x30008000ZRELADDR=0x30208000endifZRELADDRZTEXTADDRBoorloader0RAM
2compressed/Makefileifeq($(CONFIG_ARCH_S3C2410),y)OBJS+= head-s3c2410.oendifhead-s3c2410.o3compressed/head-s3c2410.S
#include #include #include
.section".start", #alloc, #execinstr
__S3C2410_start:
bicr2, pc, #0x1fadd r3, r2, #0x4000@ 16 kb is quite enough...1:ldr r0, [r2], #32teqr2, r3bne1bmcrp15, 0, r0, c7, c10, 4@drain WBmcrp15, 0, r0, c7, c7, 0@flush I&D caches
#if 0@ disabling MMU and cachesmrcp15, 0, r0, c1, c0, 0@ read control registerbicr0, r0, #0x05@ disable D cache and MMUbic r0, r0, #1000@ disable I cachemcr p15, 0, r0, c1, c0, 0#endif
movr0, #0x002000001:subsr0, r0, #1bne1b
6.2.3 LinuxLinuxmakeconfigmakemenuconfigmakexconfig makeoldconfig make config makemenuconfig makexconfig
130.configinclude/linux/autoconf.h.configautoconf.h.config.config.old
makedepLinux
makecleanmakezImagemakemodulesmakemodules_installmake cleanmake zImage,/arch/arm/bootMake modulesMake modules_install
6. 3 hello.cLinuxvim#includeintmain( ){printf(Hello world!\n);}
Linuxhello.c arm-linux-gcc o hello hello.cARMhello.exe vivi
P252101214