20160727_jeffrey - silenceuncrio/diary GitHub Wiki
- 0915 - review
- 1130 - 配合 winston 步調 準備環境
-
1310 - 點燈 參考
26.4.3.2 GPIO Write Mode
- 1450 - 知道 暫存器 點燈 後 - 寫成 assembly 塞到 uboot 去
-
1525 - 把
50
,51
和52
通通點亮 -
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 亮了
review 昨天幹了啥先
花太多時間寫 diary 的 index
剛剛 winston 主動來關心進度
先配合 winston 的步調來準備環境
- 透過 U-Boot 可以對 CPU 的暫存器做寫入
- 問 jammy gpio 對應到的燈
先整理一下從 jammy 那邊得到的情報
點燈步驟參考 26.4.3.2 GPIO Write Mode
The programming sequence for driving output signals should be as follows:
- Configure IOMUX to select GPIO mode (Via IOMUXC), also enable SION if need to read loopback pad value through PSR
- Configure GPIO direction register to output (GPIO_GDIR[GDIR] set to 1b).
- Write value to data register (GPIO_DR).
參考 26.2 External Signals
的 Table 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:
- Configure IOMUX to select GPIO mode (Via IOMUX Controller (IOMUXC) ).
- Configure GPIO direction register to input (GPIO_GDIR[GDIR] set to 0b).
- 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
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 燈一開機就亮了
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
, 51
和 52
通通點亮吧
- 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
來個 50
, 51
和 52
通通點亮的 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
把我們要的寫到 <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
點燈的這一段
修改 <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 吧