20160727_jeffrey - silenceuncrio/diary GitHub Wiki

Index

  • 0915 - review
  • 1130 - 配合 winston 步調 準備環境
  • 1310 - 點燈 參考 26.4.3.2 GPIO Write Mode
  • 1450 - 知道 暫存器 點燈 後 - 寫成 assembly 塞到 uboot 去
  • 1525 - 把 50, 5152 通通點亮
  • 1555 - 通通點亮 test.c - arm-poky-linux-gnueabi-gcc test.c -S 得到 test.s
  • 1715 - 寫到 <UBOOT_SRC>/arch/arm/cpu/armv7/start.S
  • 1740 - NAND Flash 開機 - les #50, #51, #53 亮了

0915

review 昨天幹了啥先

1130

花太多時間寫 diary 的 index

剛剛 winston 主動來關心進度

先配合 winston 的步調來準備環境

  • 透過 U-Boot 可以對 CPU 的暫存器做寫入
  • 問 jammy gpio 對應到的燈

1310

先整理一下從 jammy 那邊得到的情報

點燈步驟參考 26.4.3.2 GPIO Write Mode

The programming sequence for driving output signals should be as follows:

  1. Configure IOMUX to select GPIO mode (Via IOMUXC), also enable SION if need to read loopback pad value through PSR
  2. Configure GPIO direction register to output (GPIO_GDIR[GDIR] set to 1b).
  3. Write value to data register (GPIO_DR).

參考 26.2 External SignalsTable 26-1. GPIO External Signals

我們的四個燈如下

No Instance Signal Pad Mode
50 GPIO2 IO18 SD1_DATA0 ALT5
51 GPIO2 IO19 SD1_DATA1 ALT5
53 GPIO2 IO21 SD1_DATA3 ALT5
64 GPIO3 IO0 LCD_CLK ALT5

64 LED 燈為例, 需要對下述三個暫存器寫值

  • SW_MUX_CTL_PAD_LCD_CLK
  • GPIO3_GDIR
  • GPIO3_DR

寫值之前先試一下怎麼讀取 GPIO - 26.4.3.1 GPIO Read Mode

The programming sequence for reading input signals should be as follows:

  1. Configure IOMUX to select GPIO mode (Via IOMUX Controller (IOMUXC) ).
  2. Configure GPIO direction register to input (GPIO_GDIR[GDIR] set to 0b).
  3. Read value from data register/pad status register.

A pseudocode description to read [input3:input0] values is as follows: // SET INPUTS TO GPIO MODE. write sw_mux_ctl__, 32'h00000000 // SET GDIR TO INPUT. write GDIR[31:4,input3_bit, input2_bit, input1_bit, input0_bit,] 32'hxxxxxxx0 // READ INPUT VALUE FROM DR. read DR // READ INPUT VALUE FROM PSR. read PSR

64 LED 燈為例, 需要存取下述三個暫存器

  • SW_MUX_CTL_PAD_LCD_CLK - SET INPUTS TO GPIO MODE - Address: 20E_0000h base + 104h offset = 20E_0104h
  • GPIO3_GDIR - SET GDIR TO INPUT - 20A_4004
  • GPIO3_DR - READ INPUT VALUE FROM DR - 20A_4000

利用 U-Boot 操作的話

  • mw 020e0104 00000005 1
  • mw 020a4004 00000000 1
  • md 020a4000 1

1450

winston 表示知道怎麼利用 暫存器來點燈後

就把相關動作寫成 assembly 塞到 uboot 去

例如 U-Boot 的 mw 020e0104 00000005 1 這個動作要轉成 assembly 的話

先來一個 test.c

int main() {
*(unsigned int *)0x020e0104=0x00000005;
}

使用 arm-poky-linux-gnueabi-gcc test.c -S 得到 test.s

jeffrey@jeffrey-VirtualBox:~/tmp$ cat test.s
        ...
main:
        ...
	mov	r3, #260
	movt	r3, 526
	mov	r2, #5
	str	r2, [r3]
        ...

把我們要的貼到 <UBOOT_SRC>/arch/arm/cpu/armv7/start.S

save_boot_params_ret:
	/*
	 * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,
	 * except if in HYP mode already
	 */
	mrs	r0, cpsr
	and	r1, r0, #0x1f		@ mask mode bits
	teq	r1, #0x1a		@ test for HYP mode
	bicne	r0, r0, #0x1f		@ clear all mode bits
	orrne	r0, r0, #0x13		@ set SVC mode
	orr	r0, r0, #0xc0		@ disable FIQ and IRQ
	msr	cpsr,r0

/*
 * Setup vector:
 * (OMAP4 spl TEXT_BASE is not 32 byte aligned.
 * Continue to use ROM code vector only in OMAP4 spl)
 */
#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
	/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
	mrc	p15, 0, r0, c1, c0, 0	@ Read CP15 SCTLR Register
	bic	r0, #CR_V		@ V = 0
	mcr	p15, 0, r0, c1, c0, 0	@ Write CP15 SCTLR Register

	/* Set vector address in CP15 VBAR register */
	ldr	r0, =_start
	mcr	p15, 0, r0, c12, c0, 0	@Set VBAR
#endif

	/* the mask ROM code should have PLL and others stable */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
	bl	cpu_init_cp15
	bl	cpu_init_crit
#endif

	bl	_main

save_boot_params_ret: 是個好地方

放在 bl _main 前面

不過我的燈需要去點別顆

目前 64 LED 燈一開機就亮了

1525

No Instance Signal Pad Mode
50 GPIO2 IO18 SD1_DATA0 ALT5
51 GPIO2 IO19 SD1_DATA1 ALT5
53 GPIO2 IO21 SD1_DATA3 ALT5
64 GPIO3 IO0 LCD_CLK ALT5

來把 50, 5152 通通點亮吧

  • SW_MUX_CTL_PAD_SD1_DATA0 - mw 0x020E01C4 0x00000005 1
  • SW_MUX_CTL_PAD_SD1_DATA1 - mw 0x020E01C8 0x00000005 1
  • SW_MUX_CTL_PAD_SD1_DATA3 - mw 0x020E01D0 0x00000005 1
  • GPIO2_GDIR - mw 0x020A0004 002c0000 1
  • GPIO2_DR - mw 0x020A0000 00000000 1

1555

來個 50, 5152 通通點亮的 test.c

int main() {
  //SW_MUX_CTL_PAD_SD1_DATA0 -  mw 020E01C4 00000005 1
  *(unsigned int *)0x020E01C4 = 0x00000005;

  //SW_MUX_CTL_PAD_SD1_DATA1 -  mw 020E01C8 00000005 1
  *(unsigned int *)0x020E01C8 = 0x00000005;

  //SW_MUX_CTL_PAD_SD1_DATA3 -  mw 020E01D0 00000005 1
  *(unsigned int *)0x020E01D0 = 0x00000005;

  //GPIO2_GDIR - mw 0x020A0004 002c0000 1
  *(unsigned int *)0x020A0004 = 0x002c0000;

  //GPIO2_DR - mw 0x020A0000 00000000 1
  *(unsigned int *)0x020A0000 = 0x00000000;
}

使用 arm-poky-linux-gnueabi-gcc test.c -S 得到 test.s 裡我們要的部分

	mov	r3, #452
	movt	r3, 526
	mov	r2, #5
	str	r2, [r3]
	mov	r3, #456
	movt	r3, 526
	mov	r2, #5
	str	r2, [r3]
	mov	r3, #464
	movt	r3, 526
	mov	r2, #5
	str	r2, [r3]
	mov	r3, #4
	movt	r3, 522
	mov	r2, #2883584
	str	r2, [r3]
	mov	r3, #0
	movt	r3, 522
	mov	r2, #0
	str	r2, [r3]
	mov	r3, #0
	mov	r0, r3

1715

把我們要的寫到 <UBOOT_SRC>/arch/arm/cpu/armv7/start.S

#if 1

	/* turn on our m300 les #50, #51, #53 */  

	/* SW_MUX_CTL_PAD_SD1_DATA0 -  mw 020E01C4 00000005 1 */  
	mov	r3,	#452
	movt	r3,	526
	mov	r2,	#5
	str	r2,	[r3]

	/* SW_MUX_CTL_PAD_SD1_DATA1 -  mw 020E01C8 00000005 1 */
	mov	r3,	#456
	movt	r3,	526
	mov	r2,	#5
	str	r2,	[r3]

	/* SW_MUX_CTL_PAD_SD1_DATA3 -  mw 020E01D0 00000005 1 */
	mov	r3,	#464
	movt	r3,	526
	mov	r2,	#5
	str	r2,	[r3]

	/* GPIO2_GDIR - mw 0x020A0004 002c0000 1 */
	mov	r3,	#4
	movt	r3,	522
	mov	r2,	#2883584
	str	r2,	[r3]

	/* GPIO2_DR - mw 0x020A0000 00000000 1 */
	mov	r3,	#0
	movt	r3,	522
	mov	r2,	#0
	str	r2,	[r3]

#endif

雖然利用 SD Card 開機時 les #50, #51, #53 只有亮一下下就暗掉了

不過證明有經過 U-Boot 的 start.S

同理我們可以觀察從 NAND Flash 開機時會不會跑到 start.S 點燈的這一段

1740

修改 <UBOOT_SRC_NAND>/arch/arm/cpu/armv7/start.S

利用 公板 demo board 燒錄到 NAND Flash 去

從 NAND Flash 開機

les #50, #51, #53 亮了... 一直亮

shit! 這給出了很多情報

  • CPU 有把 NAND Falsh 裡的 U-Boot image 載入到 RAM 去執行
  • U-Boot 的 start.S 有被執行 - 因為 les #50, #51, #53 亮了

這表示

  • 不用去問 Flash 供應商的 FAE Frank 了
  • 不用去問 i.MX6UL 的供應商的 FAE Mike 了
  • morris 不用幫我量訊號了

再來的方向是

  • 利用點燈的方式用力 trace U-Boot 吧
⚠️ **GitHub.com Fallback** ⚠️