bootloader查询启动参数search_params

本文详细介绍了 Samsung K9F1208 NAND Flash 的硬件连接及操作模式,包括读写和擦除操作的时间特性,并提供了一个具体的启动代码示例,展示了如何初始化 NAND Flash 和读取启动参数。

K9F1208硬件连接图

 

K9F1208 的硬件连接图

RnB: 低电平时,表明某个写入、读写或擦除操作正在进行。完成后,恢复高电平。

CLE: 命令锁存;

ALE: 地址锁存;

NFCE: 芯片使能。

 

Samsung K9F1208U0B   NAND  Flash ,存储容量为 64MByte × 8Bit 3.3V 供电。

操作模式:先擦除,再写。擦除以块为单位,读写以页 ( 扇区 ) 为单位。

K9F1208U0B: 4096 块,   16K 512 Bytes/ 块;

                             1 块,   32 页,    512 16 Bytes/ 页。

1 个存储器器件 =528Bytes × 32 页× 4096 = 64MBytes 2048KBytes( 作为备用 )

      

       528 字节一页的写操作所需时间的典型值是 200µs ,而对 16K 字节一块的擦除操作典型值也仅需 2ms 。每一页中的数据读出速度也很快,平均每个字节只需 50ns ,已经与一般的 SRAM 相当。

           8 I/O 端口采用地址、数据和命令复用的方法。这样既可以减少引脚数,还可使接口电路简洁。

 

启动代码

i = search_params();

if(!i)

       Uart_Printf("Found boot params/n");

else if(i==-1)

  {

              Uart_Printf("Fail to found boot params!/n");

              save_params();

}

else if(i==-2)

              Uart_Printf("Fail to read EEPROM!/n");

 

 

search_params

<1>InitNandFlash 初始化 Nand   Flash

1、  InitNandCfg 初始化 Nand Flash 配置 时钟等等

2、  ReadChipId   读取 flash ID      返回 ID

(1) 使能 Flash 配置   NFChipEn     (rNFCONT &= ~(1<<1))

(2) 写命令 ID    (rNFCMD = (0x90)   命令设置寄存器

(3) 写地址 (rNFADDR = (0x00))           地址设置寄存器

(4) 等待 flash 空闲,判断状态寄存器的第 0   0 繁忙   1 空闲 , 准备好

flash 繁忙状态下是不能进行读写操作的 等待空闲状态

(5) 读取数据寄存器的值 保存 ID ID 16 位的双字节数据

id  = RdNFDat()<<8;

    id |= RdNFDat();

(6) 禁止 Flash  NFChipDs   (rNFCONT |= (1<<1))

(7) 返回 ID

3 、判读返回的 ID    注: K9S1208 ID 号为 0xEC76

if((i==0x9873)||(i==0xec75))

           NandAddr = 0;

    else if(i==0xec76)

           NandAddr = 1;

else {

           if(info)   

                  puts("Chip id error!!!/n");

           have_nandflash = 0;// 读取 ID 失败

return;

    }

have_nandflash = 1  // 读取 ID 成功

 

<2>InitNandFlash 之后 判读 have_nandflash 的值 确定 ID 是否正确读取

1 、如果 ID 读写正确    

page = NandPart[0].offset>>9; // 偏移地址除以 512 地址   第几页,每页有 512 字节

           page_cnt = NandPart[0].size>>9;  // 空间大小除以 512 ,共有几页,每页有 512 字节

 

注:

struct Partition {

                     U32 offset ;

                     U32 size;

                     char *name;

};

static struct Partition NandPart [] = {

       {0,           0x00030000, "boot"},         //192K

       {0x00030000, 0x001d0000, "kernel"}, //1856K

       {0x00200000, 0x01e00000, "rootfs"},  //30M

       {0x02000000, 0x02000000, "ext-fs1"},       //32M

       {0,                 0         , 0}

};

 

 

              while(page_cnt--) {

              ReadPage(page+page_cnt, dat);// 读一页中的数据 放在 dat 512 字节数据

              if(!strncmp(boot_params.start.flags, pBP->start.flags, 10)) // 判断 10 个字符是否相同

  {

                            ret = 0;

                            break;

                     }

 

ReadPage(U32 addr, U8 *buf) 读一页中的数据        地址,读出的数据要存放的地址

(1)    使能 Flash

(2)    写命令 WrNFCmd(0x00);

(3)    写地址 WrNFAddr(0);

(4)    addr 地址的低八位

(5)    addr 地址的高八位

(6)    如果 NandAddr=1 K9S1208  addr 地址的高十六位 32 位的地址

(7)    使能 ECC   (rNFCONT |= (1<<4))

(8)    等待空闲状态

(9)    把数据寄存器的数据放入缓冲区中,以页为单位读

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

buf[i] = RdNFDat();

/     (10) 关闭 Flash

2、  如果读取 ID 不正确

memcpy(dat, (void *)(NOR_PARAMS_OFFSET), 512); //MMU 没有设置 就用 original 地址     if(!strncmp(boot_params.start.flags, pBP->start.flags, 10)) // 拷贝启动标志位参数

                  ret = 0;

<3> 禁止 Flash     DsNandFlash();   (rNFCONT &= ~1)

<4> 如果前边都完成没有问题 ret=0; 否则 ret= -1;

// boot_params 的数据放入到 BootParams

if(!ret) {

              ParamItem *pPIS = &pBP->start, *pPID = &boot_params.start;

              for(; pPID<=&boot_params.user_params; pPIS++, pPID++)// 一个个比较个数

// 判读 flags 个数是否相同 若相同,返回 0 小于返回负数,否则返回正数

                    if(!strncmp(pPID->flags, pPIS->flags, sizeof(pPID->flags)))

                            pPID->val = pPIS->val;// 把数据给了 pPID->val

 

// pPIS->flags 中的数据 , 启动参数,复制到 boot_params.string

               strncpy(boot_params.string, pPIS->flags, boot_params.user_params.val+1);

// boot_params.user_params.val 定义为 {"userpara", sizeof(DEFAULT_USER_PARAMS)}, 若个数不对,清除刚才复制的数据 user 值赋 0

               if(boot_params.user_params.val!=strlen(pPID->flags))

{

                    memset(boot_params.string, 0, sizeof(boot_params.string));

                    boot_params.user_params.val = 0;

           }

    }

else

{

           //printf("Fail to find boot params! Use Default parameters./n");

           //don't printf anything before serial initialized!

    }

 

 

注:

typedef struct {

    char flags[12];

    unsigned int val;

} ParamItem ;

 

    typedef struct {

    ParamItem start;

    ParamItem cpu_clk;

    ParamItem boot_delay;

    ParamItem serial_sel;

    ParamItem serial_baud;

    ParamItem machine;

    ParamItem run_addr;

    ParamItem root_sel;

    ParamItem tty_sel;

    ParamItem initrd_addr;

    ParamItem initrd_len;

    ParamItem mem_cfg;

    ParamItem devfs_sel;

    ParamItem osstor;

    ParamItem user_params;

    char string[128];

} BootParams

 

// 小于等于 512 个字节 , 最多保存 24 ITEM 128 字节用户定义的字符串

BootParams boot_params = {

    {"bootpara", 1},     //0=boot without parameters,1=boot with parameters

    {"cpuclk",   2},    //0=200M, 1=300M, 2=400M, 3=440M

    {"rundelay", 0},     //0 seconds

    {"serial",   1},      //0=serial port 0, 1=serial port 1

    {"baudrate", 115200},// 波特率

    {"machine",  193},

    {"runAddr",  0x30400000},

    {"rootfs",   0},

    {"tty",      1},

    {"initrdA",  0},

    {"initrdL",  0},

    {"memsize",  0x04000000},

    {"devfs",    1},

    {"ostore",   0},    //0=nand, 1=nor

    {"userpara", sizeof(DEFAULT_USER_PARAMS)},

    DEFAULT_USER_PARAMS

};

 

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

作者:宇帆 cfanlwn

时间:2010-01-19  15:34:21


 

解释代码: #!/bin/bash pushd $(dirname $0) > /dev/null # Some Debug-related stuff CWD=$(pwd) [ "$(basename $0)" == "bashdb" ] && CWD=$BASH_DIR_TO_DBG # Overwrite global version with local versions i.e. dd PATH=$CWD:$PATH TITLE="GMA2-INSTALL" source $CWD/gma2tools source $CWD/gma2globals source $CWD/gma2dialogs ########################################################################################### declare -i i CHECK_PART= TARGET_TYPE="scsi ata" [ "$DESKTYP" == "DOT2" ] && TARGET_TYPE="usb" INSTALL_BOOT= PART_NEEDED= IMAGEFILE= WRITE_IMAGE= OUTDIR=/root/Proj/images TIMEOUT=3 CLEAN_INSTALL= #OUTDIR= mkdir $OUTDIR -p GRUB_UPDATE=no while getopts cpbf: opt do case $opt in p) PART_NEEDED=0 ;; b) INSTALL_BOOT=0 ;; f) SRCFILE=$OPTARG ;; c) CLEAN_INSTALL=0 ;; *) echo "Usage: $0 " ;; esac done [ -z "$DESKTYP" ] && DESKTYP=$(service licence desktyp) if ! isTypeValid $DESKTYP then query_desktyp DESKTYP=$RC_VALUE fi # Stange Phenomenon with mtab.tmp during umount of harddisk if overlayfs is active #service overlayfs stop ############################################################## #Just to be sure use only usb on development-machine [ $(hostname) == "quadWK" ] && TARGET_TYPE="usb" #query_dst_drv "$TARGET_TYPE" #DST_DEV=$RC_VALUE INSTALL_DEVICE= INTERNAL_DEVICE= DST_DEV= declare -i count=0 while [ "$count" -lt 10 ] do for f in `ls /dev/[hs]d*` do label=`e2label $f 2>/dev/null` if [ $? -eq 0 ] then if [ "$label" == "data.usb" ] then INSTALL_DEVICE=$f elif [ "$label" == "data" ] then INTERNAL_DEVICE=$f fi fi done [ -z "$INSTALL_DEVICE" ] || break echo "Install stick not found! Will try search again..." let count=count+1 sleep 1 udevadm trigger udevadm settle done if [ "$count" -eq 10 ] then abort "It is not possible to found install stick! Please try other." fi let count=0 if [ -z "$INTERNAL_DEVICE" ] then [ "$PART_NEEDED" == "0" ] || abort "Old version not found. Please make <Factory reset>!" for f in `ls /dev/[hs]d[a-z]` do let count+=1 done if [ $count -ge 3 ] then abort "$count disks found! Please remove ALL non-install stick(s) and try install again!" else TMP=`echo $INSTALL_DEVICE | sed 's/.$//'` #removing last symbol INTERNAL_DEVICE=`ls /dev/[hs]d[a-z] | grep -v "$TMP"` DST_DEV=$INTERNAL_DEVICE fi else DST_DEV=`echo $INTERNAL_DEVICE | sed 's/.$//'` # mkdir -p /tmp/net_backup # [ -f /boot/config/network.d/interface.eth0 ] && cp /boot/config/network.d/interface.eth0 /tmp/net_backup/ # [ -f /boot/config/network.d/interface.eth1 ] && cp /boot/config/network.d/interface.eth1 /tmp/net_backup/ # [ -f /boot/config/rc.config ] && cp /boot/config/rc.config /tmp/net_backup/ # [ -f /data/overlayfs/etc/network.d/interface.eth0 ] && cp /data/overlayfs/etc/network.d/interface.eth0 /tmp/net_backup/ # [ -f /data/overlayfs/etc/network.d/interface.eth1 ] && cp /data/overlayfs/etc/network.d/interface.eth1 /tmp/net_backup/ # [ -f /data/overlayfs/etc/rc.config ] && cp /data/overlayfs/etc/rc.config /tmp/net_backup/ fi if [ -z "$DST_DEV" ] then abort "Perhaps internal drive is corrupted!" fi echo "Waiting for mount " let count=0 while [ "$count" -lt 10 ] do INSTALL_MOUNT_POINT=`mount | grep $INSTALL_DEVICE | cut -d' ' -f3` [ -n "$INSTALL_MOUNT_POINT" ] && break let count=count+1 sleep 1 echo -n "." done if [ "$count" -eq 10 ] then abort "It is not possible to mount install stick! Please try other." fi /etc/init.d/S10udev stop umount "$DST_DEV"* 2>/dev/null ############################################################################################### #is_old_format $DST_DEV && PART_NEEDED=0 #calc_part $DST_DEV $TARGET_TYPE || PART_NEEDED=0 #DEV_SIZE=$RC_VALUE #PART_SIZES=($RC_VALUE2) if check "$PART_NEEDED" && confirm_part then #umount "$DST_DEV"* 2>/dev/null dd if=/dev/zero of="$DST_DEV" bs=512 count=1 trim_hd $DST_DEV #part_hd $DST_DEV ${PART_SIZES[*]} #mkfs_hd $DST_DEV ${PART_SIZES[*]} /sbin/fdisk "$DST_DEV" <<FDISK_SCRIPT o n p 1 2 16 n p 2 17 t 1 83 t 2 83 w FDISK_SCRIPT mkfs.ext3 "$DST_DEV"1 mkfs.ext3 "$DST_DEV"2 #tune2fs -m 0 "$DST_DEV"2 e2label "$DST_DEV"1 boot || abort "Can't set filesystem label boot" e2label "$DST_DEV"2 data || abort "Can't set filesystem label data" INSTALL_BOOT=0 else PART_NEEDED= #echo "Next step without format" echo "Updating boot (gma2install)" GRUB_UPDATE=yes fi ############################################################################################### mount "$DST_DEV"2 $TMP_MOUNT_DATA -o barrier=0,data=ordered || abort "Can't mount data-partition" TMP_MOUNT_BOOT=$TMP_MOUNT_DATA/boot mkdir $TMP_MOUNT_BOOT -p #mkdir $TMP_MOUNT_DATA/var -p MA_ARCHIVE=$TMP_MOUNT_DATA/ma/$VERSION_ARCHIVE rm $MA_ARCHIVE/* -rf mkdir $MA_ARCHIVE/installed -p if [ "$DESKTYP" != "NPU" ] then cp $INSTALL_MOUNT_POINT/ma/$VERSION_ARCHIVE/* $MA_ARCHIVE -dpr else MA_ARCHIVE=$INSTALL_MOUNT_POINT/ma/$VERSION_ARCHIVE/ fi ############## Update part ##################### IMG_NAME=gMA2Console_*.update MNT_DIR=/tmp/update_mnt UPDATE_FILES=($(find $MA_ARCHIVE/ -name "$IMG_NAME" 2>/dev/null)) UPDATE_NAME=${UPDATE_FILES[0]} mkdir $MNT_DIR mount $UPDATE_NAME $MNT_DIR -o loop ############################################################################################### [ -d "$TMP_MOUNT_BOOT/grub" ] || INSTALL_BOOT=0 #[ -d "$TMP_MOUNT_BOOT_OLD/kernel" ] || INSTALL_BOOT=0 if check "$INSTALL_BOOT" then select_archive "Select bootloader" $MNT_DIR "boot*.tar.gz" || abort "No install for bootloader" TAR_BOOT=$RC_VALUE read_info_fields $TAR_BOOT "VERSION" VERS_BOOT=${RC_FIELDS[0]} TEXT+="You are installing the following bootsystem:\n BOOT : $VERS_BOOT\n \n" fi select_gma2archive "Select gma2" $MNT_DIR "gMA2Console_*.tar.gz" "1" || abort "No install for gma" TAR_GMA=$RC_VALUE read_info_fields $TAR_GMA "GMA2 STREAMING_GMA2" VERS_GMA2=${RC_FIELDS[0]} STREAMING_GMA2=${RC_FIELDS[1]} ############################################################################################## # Create BOOT_PARAMS BOOT_PARAMS="-DAPP=$DESKTYP" [ -n "$TIMEOUT" ] && BOOT_PARAMS+=" -DTIMEOUT=$TIMEOUT" [ "$TARGET_TYPE" == "usb" ] && BOOT_PARAMS+=" -DUSB" BOOT_PARAMS+=" -DCONSOLE" BOOT_PARAMS+=" -DUTILITY" BOOT_PARAMS+=" -DMEMTEST" BOOT_PARAMS+=" -DVERS_APP=$VERS_GMA2" ############################################################################################# TEXT+="You are installing the following gMA2 Versions:\n GMA2 : $REVERSEON$VERS_GMA2$REVERSEOFF [$STREAMING_GMA2]\n" TEXT+="\n SUMMARY:\n DESKTYP: $DESKTYP\n DESTINATION: $DST_DEV ($TARGET_TYPE)\n SOURCE: $TAR_GMA\n BOOTPARAMS: $BOOT_PARAMS\n\n " if check "$CLEAN_INSTALL" then TEXT+="\n$REVERSEON WARNING: Continue will delete all your existing shows.$REVERSEOFF\n\n\n" fi query_confirm "$TEXT" || abort if check "$CLEAN_INSTALL" then pushd $MNT_DIR echo "Checking dependences" if read_deps $FILE then clean_gma2 "$TMP_MOUNT_DATA" else popd 2>/dev/null archives_missing "$RC_VALUE2" fi popd 2>/dev/null fi install_files $TAR_GMA echo "Install files finished! (gma2install)" if check "$INSTALL_BOOT" then TMP_GRUB=/tmp/grub2 export GRUB_PREFIX=$TMP_GRUB $TMP_GRUB/sbin/grub-install --modules="normal biosdisk part_msdos ext2" --boot-directory=$TMP_MOUNT_BOOT $DST_DEV $TMP_GRUB/bin/grub-editenv $TMP_MOUNT_BOOT/grub/grubenv set DESKTYP=$DESKTYP cp $TMP_GRUB/grub2.cfg.m4 $TMP_MOUNT_BOOT/grub/ #v3.1 doesn't test version of grub.cfg.m4 -> we need other name... cp $TMP_GRUB/memtest.bin $TMP_MOUNT_BOOT/grub/ m4 $BOOT_PARAMS $TMP_MOUNT_BOOT/grub/grub2.cfg.m4 > $TMP_MOUNT_BOOT/grub/grub.cfg if [ "$DESKTYP" == "NPU" ] then SPECIAL_OPTIONS+="use_i915" $TMP_GRUB/bin/grub-editenv $TMP_MOUNT_BOOT/grub/grubenv set SPECIAL_OPTIONS=$SPECIAL_OPTIONS fi #BOARD_VENDOR="$(dmidecode -s baseboard-manufacturer)" #BOARD_NAME="$(dmidecode -s baseboard-product-name)" #BOARD_VENDOR="${BOARD_VENDOR^^}" #shopt -s nocasematch #SPECIAL_OPTIONS= #if [[ "$BOARD_VENDOR" = "FOXCONN" ]] #then #if [[ "$BOARD_NAME" = "X38A" ]] #then # SPECIAL_OPTIONS+="pci=nomsi " # $TMP_GRUB/bin/grub-editenv $TMP_MOUNT_BOOT/grub/grubenv set SPECIAL_OPTIONS=$SPECIAL_OPTIONS #fi #fi fi copy_actual_kernel_as_rescue $TMP_MOUNT_BOOT/kernel #if [ "$DESKTYP" == "NPU" ] #then # echo "Updateing EEPROM of DMX-Card" # EEPROM_PROG_OK= # /usr/local/bin/ox16pci958_update_eeprom && EEPROM_PROG_OK=0 # if check "$EEPROM_PROG_OK" # then # echo "EEPROM of DMX-Card updated" # else # msgbox "EEPROM update failed" # fi #fi #mkdir -p $TMP_MOUNT_DATA/overlayfs/etc/network.d/ #if [ -z "$PART_NEEDED" ] #then # if [ ! -f $TMP_MOUNT_DATA/overlayfs/etc/network.d/interface.eth0 ] # then # [ -f /tmp/net_backup/interface.eth0 ] && cp /tmp/net_backup/interface.eth0 $TMP_MOUNT_DATA/overlayfs/etc/network.d/ # fi # if [ ! -f $TMP_MOUNT_DATA/overlayfs/etc/network.d/interface.eth1 ] # then # [ -f /tmp/net_backup/interface.eth1 ] && cp /tmp/net_backup/interface.eth1 $TMP_MOUNT_DATA/overlayfs/etc/network.d/ # fi # if [ ! -f $TMP_MOUNT_DATA/overlayfs/etc/rc.config ] # then # [ -f /tmp/net_backup/rc.config ] && cp /tmp/net_backup/rc.config $TMP_MOUNT_DATA/overlayfs/etc/ # fi #fi ############## Update part ##################### BIN_DIR=$TMP_MOUNT_DATA/ma/actual/gma2/bin rm $BIN_DIR/*.update -f [ "$DESKTYP" != "NPU" ] && cp $MNT_DIR/MAxPort_v*.update $BIN_DIR/ #[ "$DESKTYP" != "NPU" ] && cp $MNT_DIR/MABridge_v*.update $BIN_DIR/ #No bridge for 3.2! echo "* * * syncing * * *" sync umount $MNT_DIR sync if [ "$DESKTYP" != "NPU" ] then mv $MA_ARCHIVE/* $BIN_DIR/ sync fi ################################################ chmod ugo+x $TMP_MOUNT_DATA/ma/* -R # ide0 ordner der gma1 zum schreiben freigeben (rainer) #find $TMP_MOUNT_DATA/ma/ -type d -name "ide0" | xargs chmod ugo+w chmod ugo-rx $TMP_MOUNT_BOOT/grub -R #chmod ugo-rx $TMP_MOUNT_BOOT/kernel -R #Freigabe f�r Nettupdate via ftp chmod ugo+w $TMP_MOUNT_DATA/ma/versions -R if [ ! -f $TMP_MOUNT_DATA/overlayfs/etc/rc.config ] then case $DESKTYP in GMA2) HOSTNAME="grandMA2-full-size" ;; GMA2-LIGHT) HOSTNAME="grandMA2-light" ;; GMA2-ULTRA) HOSTNAME="grandMA2-ultra-light" ;; RPU) HOSTNAME="grandMA2-replay-unit" ;; NPU) HOSTNAME="MA-NPU" ;; esac echo "Setting up Hostname: $HOSTNAME" mkdir -p $TMP_MOUNT_DATA/overlayfs/etc/ echo 'HOSTNAME="'$HOSTNAME'"' > $TMP_MOUNT_DATA/overlayfs/etc/rc.config else . $TMP_MOUNT_DATA/overlayfs/etc/rc.config fi echo "Welcome to $HOSTNAME" > $TMP_MOUNT_DATA/overlayfs/etc/issue ############################################################################################## echo "* ok *" sync umount /tmp/gma2* -dl 2>/dev/null popd > /dev/null umount /dev/sd* -l 2>/dev/null msgbox "Please remove USB-Stick.\n\nPress OK to reboot" exit $RA_REBOOT
11-21
/* lcf file for MPC5634M processor */ /* */ /* 1.5 MB Flash, 94KB SRAM */ MEMORY { resetvector: org = 0x00000000, len = 0x00000008 APP_ENTRY: org = 0x00010000, len = 0x00000100 init: org = 0x00010100, len = 0x00000F00 exception_handlers: org = 0x00011000, len = 0x00001000 internal_flash: org = 0x00012000, len = 0x0006C800 /*434K*/ crc32_flash: org = 0x0007E800, len = 0x00001800 /*6K*/ ASW_flash_A: org = 0x00080000, len = 0x00060000 /*384K*/ cal_flash_A: org = 0x000E0000, len = 0x00020000 /*128K*/ ASW_flash_B: org = 0x00100000, len = 0x00060000 /*384K*/ cal_flash_B: org = 0x00160000, len = 0x00020000 /*128K*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ cal_ram: org = 0x40000000, len = 0x00008000 /*32K*/ internal_ram: org = 0x40008000, len = 0x0000A800 /*42K*/ crc32_ram: org = 0x40012800, len = 0x00001800 /*6K*/ heap : org = 0x40014000, len = 0x00002000 /*8K*/ stack : org = 0x40016000, len = 0x00001800 /*6K*/ } /* This will ensure the rchw and reset vector are not stripped by the linker */ FORCEACTIVE { "bam_rchw" "bam_resetvector" } SECTIONS { .__bam_bootarea LOAD (0x00000000): {} > resetvector .app_entry (VLECODE) LOAD(0x00010000) : {} > APP_ENTRY GROUP : { .init LOAD (0x10100) : {} .init_vle (VLECODE) LOAD (_e_init) : { *(.init) *(.init_vle) } } > init .__exception_handlers (VLECODE) LOAD (0x00011000) : {} > exception_handlers GROUP : { .text : {} .text_vle (VLECODE) ALIGN(0x08): { *(.text) *(.text_vle) } .rodata (CONST) : { *(.rdata) *(.rodata) } .ctors : {} .dtors : {} extab : {} extabindex : {} } > internal_flash /************将应用层代码和const数据放在ASW_flash************/ GROUP : { .ASW_text (VLECODE) ALIGN(0x08) LOAD (0x00080000): { KEEP(*(.ASW_function)) Sensor.o(.text) EEpromSaveVal.o(.text) CanSend.o(.text) CanReceive.o(.text) BKLrn.o(.text) ClTrqMapLrn.o(.text) TmPosCal.o(.text) EngMotCtrl.o(.text) ClCtrl.o(.text) SlopeEst_Single.o(.text) VehCtl.o(.text) SftMotPidCtrl.o(.text) ClMotPidCtrl.o(.text) TrgtGearSub.o(.text) SftCtrl.o(.text) SftCtrl_TrgtCurrSub.o(.text) TempEst.o(.text) AveCalculate_DBzCpi0h.o(.text) BINARYSEARCH_real32_T.o(.text) InValStdJdgSub_EJoZRQLM.o(.text) InValStdJdgSub_INONT01g.o(.text) look1_iflf_binlcapw.o(.text) look1_iflf_binlxpw.o(.text) look2_iflf_binlcapw.o(.text) look2_iflf_binlcpw.o(.text) look2_iflf_binlxpw.o(.text) LookUp_real32_T_real32_T.o(.text) Myfun_TimeChr2eWq0hbv.o(.text) rt_nonfinite.o(.text) rtGetInf.o(.text) rtGetNaN.o(.text) } .ASW_data (CONST) : { Sensor_data.o(.rodata) const_params.o(.rodata) ClCtrl.o(.rodata) VehCtl_data.o(.rodata) TempEst_data.o(.rodata) } } > ASW_flash_A GROUP : { .__uninitialized_intc_handlertable ALIGN(2048) : {} .data : {} .sdata : {} .sbss : {} .sdata2 : {} .sbss2 : {} .bss : {} } > internal_ram .crc32_section LOAD (0x0007E800): { KEEP(*(.crc32_section)) } > crc32_ram /************param_cal************/ .cal_section LOAD (0x000E0000) : { KEEP(*(.cal_section)) } > cal_ram } /* Freescale CodeWarrior compiler address designations */ _stack_addr = ADDR(stack)+SIZEOF(stack); _stack_end = ADDR(stack); _heap_addr = ADDR(heap); _heap_end = ADDR(heap)+SIZEOF(heap); /* Exceptions Handlers Location (used in Exceptions.c IVPR initialization)*/ EXCEPTION_HANDLERS = ADDR(exception_handlers); /* L2 SRAM Location (used for L2 SRAM initialization) */ L2SRAM_LOCATION = 0x40000000; ~~~~~~~~~~~ mpc5634链接文件flash分区, 应用层程序对应的flash区域为:ASW_flash_A/ASW_flash_B, 标定量对应的flash区域为:cal_flash_A/cal_flash_B, 都做了两个分区,即一个为激活分区,一个为备用分区,想实现对应的flash区域刷写失败后,可以切换到备用分区,我不太清楚具体怎么实现,在链接文件中,我只能指定代码或者标定参数放在ASW_flash_A,cal_flash_A中,没有办法同时放在两个段,A-B的数据刷写只能在刷写A之前写入到B中,那么在程序运行的时候,我怎么指定是运行A中或者B中的代码或者参数呢?标定参数上电是需要复制到ram中的,这个我可以处理,比较麻烦的是代码是直接在flash中运行的,怎么指定使用哪个区域的代码呢?
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值