使用JINK烧写S3C2410的nandflash 速度提升并不大 这是由于烧写FLASH时,只能每次一字节,这样大量时间都消耗在USB的传输上, 单字节传输,usb的速度完全不能体现,跟简易的jtag编程器的速度差不了多少。
主要实现如下
#include ".jlink.h"
#include "s3c2410.h"
#include "jlinkarm.h"
#pragma comment(lib, "jlinkarm.lib")
void jlink::init()
{
config = 0xf830;
JLINKARM_WriteU32(rNFCONF, config);
JLINKARM_ReadMemU32(rNFCONF, 1, (long*)&config, 0);
reset();
}
//chip enable
void jlink::enable()
{
JLINKARM_WriteU32(rNFCONF, config&0xfffff7ff);
}
//chip disable
void jlink::disable()
{
JLINKARM_WriteU32(rNFCONF, config|0x800);
}
//NFDATA read
unsigned char jlink::rx_byte()
{
char data = 0;
JLINKARM_ReadMemU8(rNFDATA, 1, &data, 0);
return data;
}
//NFDATA write
void jlink::tx_byte(unsigned char data)
{
JLINKARM_WriteU32(rNFDATA, data);
}
//NFCMD
void jlink::cmd(unsigned char data)
{
JLINKARM_WriteU32(rNFCMD, data);
}
//NFADDR
void jlink::addr(unsigned char data)
{
JLINKARM_WriteU32(rNFADDR, data);
}
//IDLE
void jlink::wait()
{
long stat = 0;
do
{
JLINKARM_ReadMemU32(rNFSTAT, 1, &stat, 0);
}while(stat&1);
}
这种方式并不能提高速度, 只是方便了没有并口的机器。
提高速度的方式,可以参考如下步骤:
1.初始化S3c2410,设置各寄存器
JLINKARM_WriteU32(rWTCON, 0);
JLINKARM_WriteU32(rINTMSK, 0xffffffff);
JLINKARM_WriteU32(rINTSUBMSK, 0x000007ff);
JLINKARM_WriteU32(rLOCKTIME, 0xFFFFFF);
JLINKARM_WriteU32(rMPLLCON, ((MDIV_50<<12)|(PDIV_50<<4)|SDIV_50));
JLINKARM_WriteU32(rCLKDIVN, 3);
JLINKARM_CP15_ReadEx(1, 0, 0, 0, &status);
status |= 0xC0000000;
status = JLINKARM_CP15_WriteEx(1, 0, 0, 0, status);
Sleep(20);
JLINKARM_WriteU32(rUPLLCON, ((0x48<<12)|(0x3<<4)|0x2));
JLINKARM_WriteU32(rMPLLCON, ((MDIV_200<<12)|(PDIV_200<<4)|SDIV_200));
2.配置MEM CTRL相关寄存器
JLINKARM_WriteU32(rBWSCON, 0x22111110);
JLINKARM_WriteU32(rBWSCON+4, 0x700);
JLINKARM_WriteU32(rBWSCON+8, 0x700);
JLINKARM_WriteU32(rBWSCON+0xC, 0x700);
JLINKARM_WriteU32(rBWSCON+0x10, 0x700);
JLINKARM_WriteU32(rBWSCON+0x14, 0x700);
JLINKARM_WriteU32(rBWSCON+0x18, 0x700);
JLINKARM_WriteU32(rBWSCON+0x1c, 0x00018005);
JLINKARM_WriteU32(rBWSCON+0x20, 0x00018005);
JLINKARM_WriteU32(rBWSCON+0x24, 0x8E0459);
JLINKARM_WriteU32(rBWSCON+0x28, 0x51);
JLINKARM_WriteU32(rBWSCON+0x2c, 0x30);
JLINKARM_WriteU32(rBWSCON+0x30, 0x30);
3.写一段下载代码到0-4k空间 (代码大可以放到内存空间)
JLINKARM_WriteMem(0, size, boot);
4.写烧写内容到内存空间
JLINKARM_WriteMem(memaddr, imagesize, image);
5.运行下载代码
JLINKARM_WriteReg(0x9, 0); //设置pc到运行处地址
JLINKARM_Go(); //运行
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7239275/viewspace-1023554/ ,如需转载,请注明出处,否则将追究法律责任。