QSD8x50開機流程 (OS - arm11)

本文详细介绍了Q8K设备Bootloader的工作流程,从初始化共享内存到设置ARM11时钟,再到启动Linux内核的过程。重点讲解了USB加载器如何与PC端Fastboot进行通讯,以及如何根据不同模式启动系统。
摘要由CSDN通过智能技术生成

這一部分將會介紹進OS這端的boot , 有點類似 Win Mobile的 Eboot .

因為我覺得改ROM的話重點會是在OS image ,所以就簡單介紹.

PC 端的Fastboot就是跟這端做溝通然後 Downlaod.

一開始的code會在init.s 不過還是簡單介紹就好就跳過,直接從C code開始.

 

Android_Q8K/bootable/bootloader/legacy/usbloader/mian.c

 

啟始的function是

int _main(unsigned zero, unsigned type, unsigned tags)

smem_init();

// 主要是初始化 share memory 準備跟arm9 溝通 ,

裡面可以看到是share memory 在arm11這端指到 0x00100000 的memory address

(init.s 看到是有啟動MMU , 所以應該是Virtual address)

然後把share memory 參數給印出來.

 

arm11_clock_init();

//初始化 arm11這邊的clock , 因為 arm11 沒進Power Collapse 的時候是由 TCXO 提供主頻.

然後用PLL 轉出不同的頻率給其他 unit 用. 所以在這設定.理論上應該不需要改.

不過想改CPU 頻率可以看裡面註解改在這, 不過進OS就會被Kernel 接管了

 

接下來做 tag的動作不太清楚是在做甚麼.Maybe再確認 Linux的版本吧

 

smem_ptable_init

//這裡應該是要建 share memory table 第一個去call的function 是 smem_get_entry

smem_get_entry的內容會先檢查 SMEM是否有init好,然後得到傳入ID的address給heap

再檢查傳入的aize, 最後回傳SMEM+heap offset 的 address , 這邊應該只是在做SMSM的初始表而已.

重點在後面要怎麼用

 

    board_init();
    keypad_init();

接下來的 board initial 我的Linux忘記把Code CO 出來.. 以後再補充.

後面的我懶了...我挑重點講

flash_init 會透過Command 去讀取 flash id 及一些參數像是page size 等

然後會做個delay後 ,再去透過SMEM 檢查是什麼原因會到fastboot這邊.

通常Hard/soft , reset都會重跑到開頭檢查. 這裡是用 SMEM_APPS_BOOT_MODE 去取得結果.

 

接下來就做usbloader_init() 先 initusb , 在boot_register_poll_func 應該是透過call back 去做USB通訊的動作.

在下來看現在是充電還是資料傳輸的狀態. 如果接下來是開進Linux就會去做 boot_linux_from_flash();

不然就到usbloader.c 做 Fastboot dpwnload USB有插上的話.

 

大概Q8K 簡單的流程如上 , 接下來會把重心都放到 Kernel/Driver上.

像是Camera 等其他Driver 從 Driver -> HAL -> Framework -> JNI 都簡單的介紹.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值