Click here to load reader

嵌入式系统讲义 第 6 章 嵌入式系统软件移植与 Linux 下程序开发

  • 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