加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

移植U-Boot-2008.10到友善之臂mini2440(三)

发布时间:2020-12-15 06:47:39 所属栏目:百科 来源:网络整理
导读:? 1.2.2? 添加Nand Flash 读取函数 ? 在board/ mini2440加入NAND Flash读取函数(start.S中需要的nand_read_ll函数)文件nand_read.c ,内容如下: #include config.h #define __REGb(x) (*(volatile unsigned char *)(x)) #define __REGi(x) (*(volatile un
?

1.2.2? 添加Nand Flash 读取函数


?

在board/ mini2440加入NAND Flash读取函数(start.S中需要的nand_read_ll函数)文件nand_read.c ,内容如下:

#include <config.h>

#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000


#if defined(CONFIG_S3C2440)

#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCONT __REGi(NF_BASE + 0x4)
#define NFCMD __REGb(NF_BASE + 0x8)
#define NFADDR __REGb(NF_BASE + 0xC)
#define NFDATA __REGb(NF_BASE + 0x10)
#define NFSTAT __REGb(NF_BASE + 0x20)

//#define GPDAT?? ??? ?__REGi(GPIO_CTL_BASE+oGPIO_F+oGPIO_DAT)

#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1))
#define NAND_CHIP_DISABLE (NFCONT |= (1<<1))
#define NAND_CLEAR_RB (NFSTAT |= (1<<2))
#define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)));}

#define BUSY 4
inline void wait_idle(void) {
?? ?while(!(NFSTAT & BUSY));
?? ?NFSTAT |= BUSY;
}

#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)

/* low level nand read function */
int
nand_read_ll(unsigned char *buf,unsigned long start_addr,int size)
{
?? ?int i,j;
?? ?
?? ?if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
?? ?return -1;?? ?/* invalid alignment */
?? ?}
?? ?
?? ?NAND_CHIP_ENABLE;
?? ??? ?
?? ?for(i=start_addr; i < (start_addr + size);) {
?? ?/* READ0 */
?? ??? ?NAND_CLEAR_RB;?? ?
?? ??? ?NFCMD = 0;?? ?
?? ?
?? ??? ?/* Write Address */
?? ??? ?NFADDR = i & 0xff;
?? ??? ?NFADDR = (i >> 9) & 0xff;
?? ??? ?NFADDR = (i >> 17) & 0xff;
?? ??? ?NFADDR = (i >> 25) & 0xff;
?? ?
?? ??? ?NAND_DETECT_RB;
?? ?
?? ??? ?for(j=0; j < NAND_SECTOR_SIZE; j++,i++) {
?? ??? ?*buf = (NFDATA & 0xff);
?? ??? ?buf++;
?? ??? ?}
?? ?}
?? ?NAND_CHIP_DISABLE;?? ?
?? ?return 0;
}
#endif

#if defined(CONFIG_S3C2410)

#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCMD __REGb(NF_BASE + 0x4)
#define NFADDR __REGb(NF_BASE + 0x8)
#define NFDATA __REGb(NF_BASE + 0xc)
#define NFSTAT __REGb(NF_BASE + 0x10)
#define BUSY 1

#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)

inline void wait_idle(void) {
?? ?int i;
?? ?while(!(NFSTAT & BUSY))
?? ?for(i=0; i<10; i++);
}
/* low level nand read function */
int
nand_read_ll(unsigned char *buf,j;
?? ?if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
?? ?return -1;?? ?/* invalid alignment */
?? ?}
?? ?/* chip Enable */
?? ?NFCONF &= ~0x800;
?? ?for(i=0; i<10; i++);
?? ?for(i=start_addr; i < (start_addr + size);) {
?? ?/* READ0 */
?? ?NFCMD = 0;
?? ?/* Write Address */
?? ?NFADDR = i & 0xff;
?? ?NFADDR = (i >> 9) & 0xff;
?? ?NFADDR = (i >> 17) & 0xff;
?? ?NFADDR = (i >> 25) & 0xff;
?? ?wait_idle();
?? ?for(j=0; j < NAND_SECTOR_SIZE; j++,i++) {
?? ?*buf = (NFDATA & 0xff);
?? ?buf++;
?? ?}
?? ?}
?? ?/* chip Disable */
?? ?NFCONF |= 0x800; /* chip disable */
?? ?return 0;
}
#endif

另外还要修改board/ /mini2440/Makefile文件,将nand_read.c编译进u-boot:

OBJS := mini2440.o nand_read.o flash.o


1.2.3?修改board/mini2440/lowlevel_init.S文件


? ??(1)修改BWSCON,mini2440 BANK0接NOR Flash,BANK4接DM9000,BANK6接RAM,对于mini2440,只要修改B4_BWSCON即可:

?

#define B3_BWSCON????????????? (DW16 + WAIT + UBLB)

//#define B4_BWSCON??????????? (DW16)

#define B4_BWSCON????????????? (DW16 + WAIT + UBLB)

#define B5_BWSCON????????????? (DW16)

……

?

#define B4_Tacs??????????????? 0x0???? /*? 0clk */

#define B4_Tcos??????????????? 0x3???? /*? 4clk */

#define B4_Tacc??????????????? 0x7???? /* 14clk */

#define B4_Tcoh??????????????? 0x1???? /*? 1clk */

#define B4_Tah???????????????? 0x3???? /*? 4clk */

#define B4_Tacp??????????????? 0x6???? /*? 6clk */

#define B4_PMC???????????????? 0x0???? /* normal */

#define B5_Tacs??????????????? 0x0???? /*? 0clk */

?

??? (2)然后修改 REFRESH 的刷新周期:

#define B7_SCAN??????????????? 0x1???? /* 9bit */

/* REFRESH parameter */

#define REFEN????????????????? 0x1???? /* Refresh enable */

#define TREFMD???????????????? 0x0???? /* CBR(CAS before RAS)/Auto refresh */

#define Trc??????????????????? 0x3???? /* 7clk */

#define Tchr?????????????????? 0x2???? /* 3clk */

//#define REFCNT????????????????????? 1113??? /* period=15.6us,HCLK=60Mhz,(2048+1-15.6*60) */

?

# if defined(CONFIG_S3C2440)

#define Trp??????????? 0x2??? /* 4clk */

#define REFCNT??????????? 1012

#else

#define Trp??????????? 0x0??? /* 2clk */

#define REFCNT ???????0x4f4?/* period=7.8125us,HCLK=100Mhz,(2048+1-7.8125*100) */

#endif

_TEXT_BASE:

??????? .word?? TEXT_BASE


1.2.4?修改GPIO和PLL的配置


?

在/board/ mini2440/mini2440.c 中对GPIO和PLL的配置进行修改(参阅开发板的硬件说明和芯片手册):

#elif FCLK_SPEED==1??????????? /* Fout = 202.8MHz */

/*#define M_MDIV?????? 0xA1

#define M_PDIV 0x3

#define M_SDIV 0x1*/

?

#if defined(CONFIG_S3C2410)

/* Fout = 202.8MHz */

#define M_MDIV??? 0xA1

#define M_PDIV??? 0x3

#define M_SDIV??? 0x1

#endif

#if defined(CONFIG_S3C2440)

/* Fout = 405MHz */

#define M_MDIV 0x7f???????

#define M_PDIV 0x2

#define M_SDIV 0x1

#endif

/*------------------------*/

#endif

……

?

#elif USB_CLOCK==1

/*#define U_M_MDIV???? 0x48

#define U_M_PDIV?????? 0x3*/

#if defined(CONFIG_S3C2410)

#define U_M_MDIV??? 0x48

#define U_M_PDIV??? 0x3

#endif

?

#if defined(CONFIG_S3C2440)

#define U_M_MDIV 0x38

#define U_M_PDIV 0x2

#endif

#define U_M_SDIV??? 0x2

#endif

?

为连接LED和蜂鸣器的GPIO修改配置寄存器:

??????? /* set up the I/O ports */

??????? gpio->GPACON = 0x007FFFFF;

/*gpio->GPBCON = 0x00044555;*/

#if defined(CONFIG_mini2440_LED)

??????? ?gpio->GPBCON = 0x00055555;

#else

??????? gpio->GPBCON = 0x00044555;

#endif

?

??????? gpio->GPBUP = 0x000007FF;

?

??? 为引导linux 内核,修改开发板的类型代码:

??????? gpio->GPHUP = 0x000007FF;

??????? /* arch number of SMDK2410-Board */

??????? //gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

?

#if defined(CONFIG_S3C2410)

??? /* arch number of SMDK2410-Board */

??? gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

#endif

#if defined(CONFIG_S3C2440)

??? /* arch number of S3C2440 -Board */

??? gd->bd->bi_arch_number = MACH_TYPE_mini2440 ;

#endif

??????? /* adress of boot parameters */

?

??? 为使int board_init (void)设置完成后,LED1和LED2同时亮起,在int board_init (void)的最后添加:

??????? icache_enable();

??????? dcache_enable();

# if defined(CONFIG_mini2440_LED)

??? gpio->GPBDAT = 0x180;

?

//int board_init (void)设置完成后,LED1和LED2会亮起!

#endif

??????? return 0;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读