⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.s

📁 UBOOT 源码
💻 S
📖 第 1 页 / 共 2 页
字号:
/*--------------------------------------------------------------------- *//* Function:    read_spd *//* Description: Reads contents of SPD and saves parameters to be used for *//*		configuration in dedicated registers (see code below). *//*---------------------------------------------------------------------	 */#define WRITE_I2C(reg,val) \	addi    r3,0,val;\	addis   r4, 0, 0xef60;\	ori     r4, r4, 0x0500 + reg;\	stb     r3, 0(r4);\	eieio#define READ_I2C(reg) \	addis   r3, 0, 0xef60;\	ori     r3, r3, 0x0500 + reg;\	lbz     r3, 0x0000(r3);\	eieioread_spd:	mflr	r5	/* Initialize i2c */	/*--------------- */	WRITE_I2C(IICLMADR, 0x00)	/* clear lo master address */	WRITE_I2C(IICHMADR, 0x00)	/* clear hi master address */	WRITE_I2C(IICLSADR, 0x00)	/* clear lo slave address */	WRITE_I2C(IICHSADR, 0x00)	/* clear hi slave address */	WRITE_I2C(IICSTS, 0x08)		/* update status register */	WRITE_I2C(IICEXTSTS, 0x8f)	WRITE_I2C(IICCLKDIV, 0x05)	WRITE_I2C(IICINTRMSK, 0x00)	/* no interrupts */	WRITE_I2C(IICXFRCNT, 0x00)	/* clear transfer count */	WRITE_I2C(IICXTCNTLSS, 0xf0)	/* clear extended control & stat */	WRITE_I2C(IICMDCNTL, IIC_MDCNTL_FSDB | IIC_MDCNTL_FMDB)	/* mode control */	READ_I2C(IICMDCNTL)	ori	r3, r3, IIC_MDCNTL_EUBS | IIC_MDCNTL_HSCL	WRITE_I2C(IICMDCNTL, r3)	/* mode control */	WRITE_I2C(IICCNTL, 0x00)	/* clear control reg */	/* Wait until initialization completed */	/*------------------------------------ */	bl	wait_i2c_transfer_done	WRITE_I2C(IICHMADR, 0x00)	/* 7-bit addressing */	WRITE_I2C(IICLMADR, SDRAM_SPD_WRITE_ADDRESS)	/* Write 0 into buffer(start address) */	/*----------------------------------- */	WRITE_I2C(IICMDBUF, 0x00);	/* Wait a little */	/*-------------- */	addis   r3,0,0x0000	ori     r3,r3,0xA000	mtctr   r3in02:	bdnz    in02	/* Issue write command */	/*-------------------- */	WRITE_I2C(IICCNTL, IIC_CNTL_PT)	bl	wait_i2c_transfer_done	/* Read 128 bytes */	/*--------------- */	addi	r7, 0, 0	/* byte counter in r7 */	addi	r8, 0, 0	/* checksum in r8 */rdlp:	/* issue read command */	/*------------------- */	cmpi	0, r7, 127	blt	rd01	WRITE_I2C(IICCNTL, IIC_CNTL_READ | IIC_CNTL_PT)	bl	rd02rd01:	WRITE_I2C(IICCNTL, IIC_CNTL_READ | IIC_CNTL_CHT | IIC_CNTL_PT)rd02:	bl	wait_i2c_transfer_done	/* Fetch byte from buffer */	/*----------------------- */	READ_I2C(IICMDBUF)	/* Retrieve parameters that are going to be used during configuration. */	/* Save them in dedicated registers. */	/*------------------------------------------------------------ */	cmpi	0, r7, 3	/* Save byte 3 in r10 */	bne	rd10	addi	r10, r3, 0rd10:	cmpi	0, r7, 4	/* Save byte 4 in r11 */	bne	rd11	addi	r11, r3, 0rd11:	cmpi	0, r7, 5	/* Save byte 5 in r12 */	bne	rd12	addi	r12, r3, 0rd12:	cmpi	0, r7, 17	/* Save byte 17 in r13 */	bne	rd13	addi	r13, r3, 0rd13:	cmpi	0, r7, 18	/* Save byte 18 in r14 */	bne	rd14	addi	r14, r3, 0rd14:	cmpi	0, r7, 31	/* Save byte 31 in r15 */	bne	rd15	addi	r15, r3, 0rd15:	cmpi	0, r7, 27	/* Save byte 27 in r16 */	bne	rd16	addi	r16, r3, 0rd16:	cmpi	0, r7, 29	/* Save byte 29 in r17 */	bne	rd17	addi	r17, r3, 0rd17:	cmpi	0, r7, 30	/* Save byte 30 in r18 */	bne	rd18	addi	r18, r3, 0rd18:	cmpi	0, r7, 9	/* Save byte 9 in r19 */	bne	rd19	addi	r19, r3, 0rd19:	cmpi	0, r7, 23	/* Save byte 23 in r20 */	bne	rd20	addi	r20, r3, 0rd20:	cmpi	0, r7, 25	/* Save byte 25 in r21 */	bne	rd21	addi	r21, r3, 0rd21:	/* Calculate checksum of the first 63 bytes */	/*----------------------------------------- */	cmpi	0, r7, 63	bgt	rd31	beq	rd30	add	r8, r8, r3	bl	rd31	/* Verify checksum at byte 63 */	/*--------------------------- */rd30:	andi.	r8, r8, 0xff		/* use only 8 bits */	cmp	0, r8, r3	beq	rd31	addi	r4, 0, LED_SDRAM_CODE_8	addis	r5, 0, 0x1000	ori	r5, r5, 0x0001	stb	r4,0(r5)	eieiorderr:	bl	rderrrd31:	/* Increment byte counter and check whether all bytes have been read. */	/*------------------------------------------------------------------- */	addi	r7, r7, 1	cmpi	0, r7, 127	bgt	rd05	bl	rdlprd05:	mtlr    r5                     /* restore lr */	blrwait_i2c_transfer_done:	mflr	r6wt01:	READ_I2C(IICSTS)	andi.	r4, r3, IIC_STS_PT	cmpi	0, r4, IIC_STS_PT	beq	wt01	mtlr    r6                     /* restore lr */	blr/*--------------------------------------------------------------------- *//* Function:    find_mode *//* Description: Determines addressing mode to be used dependent on   *//*		number of rows (r10 = byte 3 from SPD), number of columns (r11 = *//*		byte 4 from SPD) and number of banks (r13 = byte 17 from SPD). *//*		mode is returned in r3. *//* (It would be nicer having a table, pnc). *//*---------------------------------------------------------------------	 */find_mode:	mflr	r5	cmpi	0, r10, 11	bne	fm01	cmpi	0, r11, 9	bne	fm01	cmpi	0, r13, 2	bne	fm01	addi	r3, 0, 1	bl	fmfoundfm01:	cmpi	0, r10, 11	bne	fm02	cmpi	0, r11, 10	bne	fm02	cmpi	0, r13, 2	bne	fm02	addi	r3, 0, 1	bl	fmfoundfm02:	cmpi	0, r10, 12	bne	fm03	cmpi	0, r11, 9	bne	fm03	cmpi	0, r13, 4	bne	fm03	addi	r3, 0, 2	bl	fmfoundfm03:	cmpi	0, r10, 12	bne	fm04	cmpi	0, r11, 10	bne	fm04	cmpi	0, r13, 4	bne	fm04	addi	r3, 0, 2	bl	fmfoundfm04:	cmpi	0, r10, 13	bne	fm05	cmpi	0, r11, 9	bne	fm05	cmpi	0, r13, 4	bne	fm05	addi	r3, 0, 3	bl	fmfoundfm05:	cmpi	0, r10, 13	bne	fm06	cmpi	0, r11, 10	bne	fm06	cmpi	0, r13, 4	bne	fm06	addi	r3, 0, 3	bl	fmfoundfm06:	cmpi	0, r10, 13	bne	fm07	cmpi	0, r11, 11	bne	fm07	cmpi	0, r13, 4	bne	fm07	addi	r3, 0, 3	bl	fmfoundfm07:	cmpi	0, r10, 12	bne	fm08	cmpi	0, r11, 8	bne	fm08	cmpi	0, r13, 2	bne	fm08	addi	r3, 0, 4	bl	fmfoundfm08:	cmpi	0, r10, 12	bne	fm09	cmpi	0, r11, 8	bne	fm09	cmpi	0, r13, 4	bne	fm09	addi	r3, 0, 4	bl	fmfoundfm09:	cmpi	0, r10, 11	bne	fm10	cmpi	0, r11, 8	bne	fm10	cmpi	0, r13, 2	bne	fm10	addi	r3, 0, 5	bl	fmfoundfm10:	cmpi	0, r10, 11	bne	fm11	cmpi	0, r11, 8	bne	fm11	cmpi	0, r13, 4	bne	fm11	addi	r3, 0, 5	bl	fmfoundfm11:	cmpi	0, r10, 13	bne	fm12	cmpi	0, r11, 8	bne	fm12	cmpi	0, r13, 2	bne	fm12	addi	r3, 0, 6	bl	fmfoundfm12:	cmpi	0, r10, 13	bne	fm13	cmpi	0, r11, 8	bne	fm13	cmpi	0, r13, 4	bne	fm13	addi	r3, 0, 6	bl	fmfoundfm13:	cmpi	0, r10, 13	bne	fm14	cmpi	0, r11, 9	bne	fm14	cmpi	0, r13, 2	bne	fm14	addi	r3, 0, 7	bl	fmfoundfm14:	cmpi	0, r10, 13	bne	fm15	cmpi	0, r11, 10	bne	fm15	cmpi	0, r13, 2	bne	fm15	addi	r3, 0, 7	bl	fmfoundfm15:	/* not found, error code to be issued on LEDs */	addi	r7, 0, LED_SDRAM_CODE_2	addis	r6, 0, 0x1000	ori	r6, r6, 0x0001	stb	r7,0(r6)	eieiofmerr:	bl	fmerrfmfound:addi	r6, 0, 1	subf	r3, r6, r3	mtlr    r5                     /* restore lr */	blr/*--------------------------------------------------------------------- *//* Function:    find_size_code *//* Description: Determines size code to be used in configuring SDRAM controller *//*		dependent on density (r15 = byte 31 from SPD) *//*--------------------------------------------------------------------- */find_size_code:	mflr	r5	addi	r3, r15, 0	/* density */	addi	r7, 0, 0fs01:	andi.	r6, r3, 0x01	cmpi	0, r6, 1	beq	fs04	addi	r7, r7, 1	cmpi	0, r7, 7	bge	fs02	addi	r9, 0, 1	srw	r3, r3, r9	bl	fs01	/* not found, error code to be issued on LEDs */fs02:	addi	r4, 0, LED_SDRAM_CODE_3	addis	r8, 0, 0x1000	ori	r8, r8, 0x0001	stb	r4,0(r8)	eieiofs03:	bl	fs03fs04:	addi	r3, r7, 0	cmpi	0, r3, 0	beq	fs05	addi	r6, 0, 1	subf	r3, r6, r3fs05:	mtlr    r5                     /* restore lr */	blr/*--------------------------------------------------------------------- *//* Function:    find_casl *//* Description: Determines CAS latency *//*--------------------------------------------------------------------- */find_casl:	mflr	r5	andi.	r14, r14, 0x7f	/* r14 holds supported CAS latencies */	addi	r3, 0, 0xff	/* preset determined CASL */	addi	r4, 0, 6	/* Start at bit 6 of supported CAS latencies */	addi	r2, 0, 0	/* Start finding highest CAS latency */fc01:	srw	r6, r14, r4	/*  */	andi.	r6, r6, 0x01	/*  */	cmpi	0, r6, 1	/* Check bit for current latency */	bne	fc06		/* If not supported, go to next */	cmpi	0, r2, 2	/* Check if third-highest latency */	bge	fc04		/* If so, go calculate with another format */	cmpi	0, r2, 0	/* Check if highest latency */	bgt	fc02		/* */	addi	r7, r19, 0	/* SDRAM cycle time for highest CAS latenty */	bl	fc03fc02:	addi	r7, r20, 0	/* SDRAM cycle time for next-highest CAS latenty */fc03:	addi	r8, r7, 0	addi	r9, 0, 4	srw	r7, r7, r9	andi.	r7, r7, 0x0f	mulli	r7, r7, 100	andi.	r8, r8, 0x0f	mulli	r8, r8, 10	add	r7, r7, r8	cmp	0, r7, r30	bgt	fc05	addi	r3, r2, 0	bl	fc05fc04:	addi	r7, r21, 0	/* SDRAM cycle time for third-highest CAS latenty */	addi	r8, r7, 0	addi	r9, 0, 2	srw	r7, r7, r9	andi.	r7, r7, 0x3f	mulli	r7, r7, 100	andi.	r8, r8, 0x03	mulli	r8, r8, 25	add	r7, r7, r8	cmp	0, r7, r30	bgt	fc05	addi	r3, r2, 0fc05:	addi	r2, r2, 1	/* next latency */	cmpi	0, r2, 3	bge	fc07fc06:	addi	r6, 0, 1	subf	r4, r6, r4	cmpi	0, r4, 0	bne	fc01fc07:	mtlr    r5		/* restore lr */	blr#endif/*  Peripheral Bank 1 Access Parameters *//*     0	BME = 1	; burstmode enabled *//*    " 1:8"	TWT=00110110	;Transfer wait (details below) *//*     1:5	FWT=00110	; first wait = 6 cycles *//*     6:8	BWT=110	; burst wait = 6 cycles *//*     9:11	000	; reserved *//*     12:13	CSN=00	; chip select on timing = 0 *//*     14:15	OEN=01	; output enable  *//*     16:17	WBN=01	; write byte enable on timing 1 cycle *//*     18:19	WBF=01	; write byte enable off timing 1 cycle *//*     20:22	TH=010	; transfer hold = 2 cycles *//*     23	RE=0	; ready enable = disabled *//*     24	SOR=1	; sample on ready = same PerClk *//*     25	BEM=0	; byte enable mode = only for write cycles *//*     26	PEN=0	; parity enable = disable *//*     27:31	00000	;reserved *//* *//* 1 + 00110 + 110 + 000 + 00 + 01 + 01 + 01 + 010 + 0 + 1 + 0 + 0 + 00000 = 0x9b015480 *//* *//* *//*	Code for BDI probe: *//* *//* WDCR    18      0x00000011      ;Select PB1AP *//* WDCR    19      0x1b015480      ;PB1AP: Flash *//* *//* Peripheral Bank 0 Access Parameters *//* 0:11	BAS=0x200	; base address select = 0x200 * 0x100000 (1MB) =  *//* 12:14	BS=100	; bank size =  16MB (100) / 32MB (101) *//* 15:16	BU=11	; bank usage = read/write *//* 17:18	BW=00	; bus width = 8-bit *//* 19:31		; reserved *//* *//* 0x200 + 100 + 11 + 00 + 0 0000 0000 0000 = 0x20098000 *//* WDCR    18      0x00000001      ;Select PB1CR *//* WDCR    19      0x20098000      ;PB1CR: 1MB at 0x00100000, r/w, 8bit *//* For CPLD *//* 0 + 00000 + 010 + 000 + 00 + 01 + 00 + 00 + 000 + 0 + 0 + 1 + 0 + 00000 *//*	WDCR_EBC(pb5ap, 0x01010040) *//*jsa recommendation:		WDCR_EBC(pb5ap, 0x00010040) *//*	WDCR_EBC(pb5cr, 0X10018000) *//* Access parms *//*   100   3      8          0    0    0 *//* 0x100 + 001 + 11 + 00 + 0 0000 0000 0000 = 0x10038000 *//* Address :	0x10000000 *//* Size:	2 MB *//* Usage:	read/write *//* Width:	32 bit *//* For Genie onboard fpga 32 bit interface *//* 0      1      0         1         0         0         0            0 *//* 0 + 00000 + 010 + 000 + 00 + 01 + 00 + 00 + 000 + 0 + 0 + 0 + 0 + 00000 *//* 0x01010000 *//* Access parms *//*   102   1      c          0    0    0 *//* 0x102 + 000 + 11 + 10 + 0 0000 0000 0000 = 0x1021c000 *//* Address :	0x10200000 *//* Size:	2 MB *//* Usage:	read/write *//* Width:	32 bit *//* Walnut fpga pb7ap *//* 0      1      8         1         5         2         8            0 *//* 0 + 00000 + 011 + 000 + 00 + 01 + 01 + 01 + 001 + 0 + 1 + 0 + 0 + 00000 *//* Walnut fpga pb7cr *//* 0xF0318000 *//*  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -