/* set starting physical address & size of memory region for
* overlay window and default window */
pmem_start = s5p_get_media_memory_bank(S5P_MDEV_FIMD, 1);
printk('fimd at 0x%08xn', pmem_start);
for (i = 0; i < num_overlay_win; i++) {
*(npd->nr_buffers+i) = CONFIG_FB_S3C_NUM_BUF_OVLY_WIN;
*(npd->pmem_start+i) = pmem_start;
*(npd->pmem_size+i) = frame_size * *(npd->nr_buffers+i);
pmem_start += *(npd->pmem_size+i);
}
npd->nr_buffers[default_win] = CONFIG_FB_S3C_NR_BUFFERS;
npd->pmem_start[default_win] = pmem_start;
npd->pmem_size[default_win] = frame_size * npd->nr_buffers[default_win];
#if defined(CONFIG_MACH_MINI210)
npd->pmem_size[default_win] += ALIGN(1280*720, PAGE_SIZE) * 3;
npd->pmem_size[default_win] += ALIGN(1280*360, PAGE_SIZE) * 3 + PAGE_SIZE;
if (frame_size > 0x200000) { // Not Used : frame_size < 0x200000
pmem_start += npd->pmem_size[default_win];
for (; i < npd->nr_wins; i++) {
if (i != default_win) {
npd->nr_buffers[i] = 2;
npd->pmem_start[i] = pmem_start;
npd->pmem_size[i] = frame_size * npd->nr_buffers[i];
break;
}
}
}
#endif
s3c_device_fb.dev.platform_data = npd;
}
}
我們需要留意一下上面這段代碼,
因為 num_overlay_win 是 CONFIG_FB_S3C_NUM_OVLY_WIN=1,所以 for 循環(huán)只執(zhí)行了一次,那么 window 0 的物理內(nèi)存地址初始化了。
然后又手工為 default_win 也就是 CONFIG_FB_S3C_DEFAULT_WINDOW=2 進(jìn)行了初始化。
也就是說: window 0 和 window 2 在platform初始化中記錄了數(shù)據(jù)buffer的物理內(nèi)存地址。
雖然是 for 循環(huán)做的,我認(rèn)為這個for循環(huán)寫得不好。
7. 在s3cfb初始化過程中,為window 關(guān)聯(lián)這些內(nèi)存
在初始化過程中,會分配fb設(shè)備相關(guān)數(shù)據(jù)結(jié)構(gòu),并注冊fb設(shè)備。
drivers/video/samsung/s3cfb.c
--------------------------------------------------
static int __devinit s3cfb_probe(struct platform_device *pdev)
{
......
if (s3cfb_alloc_framebuffer(fbdev)) {
ret = -ENOMEM;
goto err_alloc;
}
if (s3cfb_register_framebuffer(fbdev)) {
ret = -EINVAL;
goto err_register;
}
......
}
但是我們發(fā)現(xiàn),只有當(dāng) fb 設(shè)備對應(yīng)的 window 是 default window ,也就是 window 2 的時候,
才會將 window 2 對應(yīng)的內(nèi)存映射到內(nèi)存空間。
雖然預(yù)留的物理內(nèi)存是 window 0 和 window 2 的,但這個時候 window 0 的物理內(nèi)存是沒有被映射的。
drivers/video/samsung/s3cfb.c
--------------------------------------------------
static int s3cfb_alloc_framebuffer(struct s3cfb_global *ctrl)
{
......
for (i = 0; i < pdata->nr_wins; i++) {
ctrl->fb[i] = framebuffer_alloc(sizeof(*ctrl->fb), ctrl->dev);
if (!ctrl->fb[i]) {
dev_err(ctrl->dev, 'not enough memoryn');
ret = -ENOMEM;
goto err_alloc_fb;
}
......
if (i == pdata->default_win) {
if (s3cfb_map_video_memory(ctrl->fb[i])) {
dev_err(ctrl->dev,
'failed to map video memory '
'for default window (%d)n', i);
ret = -ENOMEM;
goto err_map_video_mem;
}
}
}
......
}
這是注冊 fb 設(shè)備的地方,只要注冊成功,/dev 目錄下就會有一個 fb 文件。
雖然只給 window 2 映射了顯示數(shù)據(jù)的內(nèi)存,但是 for 循環(huán)還是將所有的 window 都注冊設(shè)備文件了。
這就是為什么 /dev 目錄下有 fb0 - fb4 5個fb設(shè)備。其實每一個 fb 設(shè)備對應(yīng)一個 window。
另外需要注意的是,第一個注冊的 fb 是 fb0,然后依次 ++。
下面的代碼在注冊的時候, 首先注冊的是 default window 2,然后是 3, 4, 0, 1。
也就是說 :
fb0 -> window 2
fb1 -> window 3
fb2 -> window 4
fb3 -> window 0
fb4 -> window 1
另外還需要注意的是,如果你直接去 cat /dev/fbX ,只有 fb0 是成功的,其他全部失敗,
因為到目前位置,只有 fb0 也就是 default window 2,映射了顯示數(shù)據(jù)的內(nèi)存。
drivers/video/samsung/s3cfb.c
--------------------------------------------------
static int s3cfb_register_framebuffer(struct s3cfb_global *ctrl)
{
......
k = 0;
for (i = pdata->default_win;
i < pdata->nr_wins + pdata->default_win; i++) {
j = i % pdata->nr_wins;
ret = register_framebuffer(ctrl->fb[j]);
if (ret) {
dev_err(ctrl->dev, 'failed to register '
'framebuffer devicen');
ret = -EINVAL;
goto err_register_fb;
}
pdata->fb_file_minor[ j ] = k;
k++;
#ifndef CONFIG_FRAMEBUFFER_CONSOLE
if (j == pdata->default_win) {
s3cfb_check_var(&ctrl->fb[j]->var, ctrl->fb[j]);
s3cfb_set_par(ctrl->fb[j]);
s3cfb_draw_logo(ctrl->fb[j]);
}
#endif
上一篇:應(yīng)用目錄S5PV210的BL1應(yīng)用
下一篇:S5PV210 | 根文件系統(tǒng)文件詳情
推薦閱讀最新更新時間:2025-04-24 12:25


設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實惠套件和強(qiáng)大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴(kuò)展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機(jī)自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- OP495GPZ單電源儀表放大器的典型應(yīng)用
- 18650觸控?zé)o級調(diào)光LED燈
- MCIMX28EVKJ: i.MX28評估套件
- 1W、5V AC 到 DC 單路輸出電源,用于 AC 到 DC 電源
- 樂天一號(基于HK32綜合控制板)
- AD10465/PCB,用于評估 AD10465 雙通道、14 位、65 MSPS A/D 轉(zhuǎn)換器的評估板
- EMMC轉(zhuǎn)TF卡
- 焊接照明燈
- LTC3442 鋰離子至 3.3V 轉(zhuǎn)換器提供 1.2A 電流,具有自動突發(fā)模式操作
- AP7335 300mA 低靜態(tài)電流、低壓差固定輸出線性穩(wěn)壓器的典型應(yīng)用
- Vishay 推出的27款600 V標(biāo)準(zhǔn)整流器和60 V - 200 V TMBS?整流器
- 泰克亮相2025 慕尼黑展: 以全棧式解決方案與中國智造同頻共振
- Nordic Semiconductor nRF9151 蜂窩物聯(lián)網(wǎng)模組與日本 IIJ SoftSIM產(chǎn)品相輔相成
- 汽車顯示屏——第2部分:TFT LCD、OLED和micro-LED顯示屏電源技術(shù)
- 車機(jī)操作系統(tǒng)自主可控加速!華為、小米和理想,誰是真正的領(lǐng)跑者?
- FOC入門教程
- 如何為工業(yè)物聯(lián)網(wǎng)選擇最節(jié)能的通信方案
- 什么是PID算法?一文帶你深度理解PID算法
- 控制無刷直流電動機(jī)以應(yīng)對新挑戰(zhàn)
- 汽車加熱器的工作原理和功能
- ADI有獎下載活動之23:ADI民用無人機(jī)解決方案
- 是德科技白皮書下載:攻克當(dāng)前面臨的毫米波測試難關(guān)
- MPS電機(jī)研究院 讓電機(jī)更聽話的秘密! 第一站:電機(jī)應(yīng)用知識大考!
- 有獎直播:是德科技高速芯片設(shè)計新技術(shù)研討會
- Altera Cyclone V 開發(fā)板全體驗
- 借助 Microchip 生態(tài)系統(tǒng)中的 PIC® 和 AVR® 單片機(jī)開啟嵌入式到云端之旅 系列在線研討會
- Microchip直播|如何在ADAS系統(tǒng)中解決精密授時挑戰(zhàn)
- 2009 EEWORLD 年度人物大評選活動評獎揭曉
- Moto z3 play渲染圖曝光 設(shè)計一脈傳承
- 編輯親身探訪小米售后服務(wù) 手機(jī)壞了怎么修?
- 為什么這位清華教授說 國產(chǎn)AI芯片最缺“犧牲”機(jī)會
- 碎片化的IoT時代,中天微填補(bǔ)國產(chǎn)嵌入式CPU空白
- 預(yù)裝Android8.1 中興新機(jī)入網(wǎng)工信部
- 真正的汽車0級認(rèn)證和低壓1級汽車級EEPROM支持下一代特性
- 電動汽車市場將被GaN器件改變?
- “全自動駕駛”字樣從特斯拉官網(wǎng)消失,意味著什么
- 看完這篇文章,你就知道你特斯拉Autopilot V9強(qiáng)在哪里
- 馬斯克終于服軟,“全自動駕駛”被撤回