日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]公司使用的sam9260平臺,LCD自帶控制器,單色。MinGUI的文檔說支持單色LCD,所以打算根據(jù)現(xiàn)有LCD操作方法結(jié)合framebuff驅(qū)動格式編寫一個支持framebuff的新驅(qū)動。原有的LCD操作方法實現(xiàn)了畫矩形、ASCII字符、漢字。最終

公司使用的sam9260平臺,LCD自帶控制器,單色。MinGUI的文檔說支持單色LCD,所以打算根據(jù)現(xiàn)有LCD操作方法結(jié)合framebuff驅(qū)動格式編寫一個支持framebuff的新驅(qū)動。

原有的LCD操作方法實現(xiàn)了畫矩形、ASCII字符、漢字。最終是根據(jù)字符或漢字的點陣信息在屏幕上打點!如此而已。原LCD驅(qū)動做了個雙緩沖顯示區(qū),根據(jù)緩沖區(qū)的變化改寫LCD設(shè)備的顯示區(qū),新的framebuff驅(qū)動核心思想是:直接操作顯示區(qū)域,需要自己寫的framebuff驅(qū)動里沒有畫點、畫圓、顯示字符、顯示漢字等的具體操作。這些操作在framebuff驅(qū)動框架里已經(jīng)實現(xiàn),無需自己編寫。下面記錄下framebuff驅(qū)動的編寫過程,LCD硬件部分僅保留修改LCD顯示區(qū)的IO映射和數(shù)據(jù)寫入即可。

手上這款LCD自帶控制器,只能通過讀寫其提供寄存器和他交互數(shù)據(jù),不能直接映射他的顯示區(qū)域。所以我在驅(qū)動里申請了2個和LCD顯示緩沖區(qū)一樣大小的內(nèi)存,一個用于模擬framebuff驅(qū)動需要的共享內(nèi)存區(qū)域,另一個用來保存這個模擬共享區(qū)域的快照,用于比對共享區(qū)域的變化。當(dāng)檢測到共享內(nèi)存區(qū)域的變化后,將這個變化通過LCD的寄存器寫給LCD,這樣就能實現(xiàn)共享區(qū)域的變化能被同步反映到LCD設(shè)備上。

在內(nèi)核的drivers/video/目錄下有很多fb設(shè)備的驅(qū)動,我找了個簡單的dnfb.c作為參考,以他為藍本實現(xiàn)我的驅(qū)動。首先修改drivers/video下Kconfig,添加:

config FB_DISPLAY

tristate"WHZYDZ LCD support"

depends on FB && ARM

select FB_CFB_FILLRECT

select FB_CFB_COPYAREA

select FB_CFB_IMAGEBLIT

接著修改Makefile,添加:

obj-$(CONFIG_FB_DISPLAY) += zydz_fb.o

我們在zydz_fb.c中來寫驅(qū)動代碼,首先要完成顯示區(qū)域的變化如何寫入到設(shè)備,這個雖不是framebuff驅(qū)動本身特有的,但其作為最基本的一環(huán),必須先實現(xiàn)。原系統(tǒng)平臺的相關(guān)驅(qū)動可以借鑒。原來的驅(qū)動代碼是先定位到LCD顯示緩沖的行首,然后一個字節(jié)一個字節(jié)的寫,直到寫完一行的數(shù)據(jù),其中位置光標(biāo)自動右移。但在我這,一行點位根本顯示不全,我們用的是RA9935A,我懷疑它在控制自動移位方面可能存在問題。后來我改變寫數(shù)據(jù)的方式:自己控制位置光標(biāo),然后寫一個字節(jié)!這樣能正常顯示了。

接先來就是和MiniGUI聯(lián)調(diào),邊調(diào)邊修改我的驅(qū)動。MinGUI得使用shadow引擎才能支持8bpp以下的。重新編譯minigui,configure 時加上--enable-newgal

--enable-videoshadow

--with-targetname=fbcon

MiniGUI.cfg配置文件修改如下:

[system]

# GAL engine and default options

gal_engine=shadow

defaultmode=320x240-1bpp

[shadow]

real_engine=fbcon

經(jīng)過n次的測試,主要方法是在MinGUI中增加打印信息,根據(jù)輸出信息判斷出錯的位置,然后修改驅(qū)動。最后跟到了src/newgal/video.c的int GAL_VideoModeOK (int width, int height, int bpp, Uint32 flags)函數(shù),

里面有段注釋和代碼看了,讓人心涼了一大節(jié)!

/* Currently 1 and 4 bpp are not supported */

if ( bpp < 8 || bpp > 32 ) {

return(0);

}

看來MinGUI1.6.10是不支持位深小于8的屏了。我嘗試著注釋掉了這段代碼,以便讓MinGUI能完成初始化的工作。接著出現(xiàn)下面的錯誤:

Linux_fbcon fb_fix.line_length=40

Linux_fbcon fbcon_info.yres=240

Linux_fbcon fbcon_info.fb_size=12288

Linux_fbcon fbcon_info.fb=40021000

Linux_fbcon fbcon_info.bpp=1

GAL_GetVideoMode 1

width=320

height=240

bpp=1

Unhandled fault: external abort on non-linefetch (0x008) at 0x40021000

Bus error

查看linux_fbcon.c:

fbcon_info.fb =

#ifdef _FXRM9200_IAL /* workaround for Fuxu RM9200 */

mmap (NULL, fbcon_info.fb_size, PROT_READ | PROT_WRITE, MAP_SHARED,

fbcon_info.fd_fb, 0);

#elif defined (__uClinux__)

mmap (NULL, fbcon_info.fb_size, PROT_READ | PROT_WRITE, 0,

fbcon_info.fd_fb, 0);

#else

mmap (NULL, fbcon_info.fb_size, PROT_READ | PROT_WRITE, MAP_SHARED,

fbcon_info.fd_fb, 0);

#endif

這個使用到了framebuff驅(qū)動的mmap調(diào)用,再查看drivers/video/Fbmem.c默認的fb_mmap函數(shù):

/* frame buffer memory */

start = info->fix.smem_start;

len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len);

他會將info->fix.smem_start這個物理地址進行映射。好了,framebuff驅(qū)動里面我們可以使用virt_to_phys獲取共享內(nèi)存區(qū)域的物理地址!

自此,edit例程總算運行起來了!顯示效果見下圖:


顯示效果不理想,MiniGUI還是用在8bpp以上屏上合適!,下面貼上主要的代碼:

* linux/drivers/video/zydzfb.c -- ZYDZ graphics adaptor frame buffer device


*


* Created 16 Sep2011 by hongchang.yu(yu_hongchang@163.com)


* Based on dnfb.c


*


* History:


*


* This file is subject to the terms and conditions of the GNU General Public


* License. See the file COPYING in the main directory of this archive


* for more details.


*/


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include



#define LCD_WIDTH 320

#define LCD_HEIGHT 240

#define DISPRAMBUFLSZ (LCD_WIDTH/8)

#define DISPRAMBUFSIZE (DISPRAMBUFLSZ*LCD_HEIGHT)

/* display_ video definitions */


static void __iomem *io_data=NULL;

static void __iomem *io_cmd=NULL;

static void __iomem *io_ctrl=NULL;

static unsigned long ioo_data=0;


static unsigned char *rambuf_org = NULL;

static unsigned char *rambuf_cur = NULL;


/* frame buffer operations */

// zydzfb_blank控制屏幕開關(guān)

static int zydzfb_blank(int blank, struct fb_info *info);


static struct fb_ops zydzfb_ops = {

.owner = THIS_MODULE,

//.fb_blank = zydzfb_blank,

.fb_fillrect = cfb_fillrect,

.fb_copyarea = cfb_copyarea,

.fb_imageblit = cfb_imageblit,

};


struct fb_var_screeninfo zydzfb_var __devinitdata = {

.xres = 320,//實際x軸分辨率

.yres = 240,//實際y軸分辨率

.xres_virtual = 320,//虛擬x軸分辨率

.yres_virtual = 240,//虛擬y軸分辨率

.bits_per_pixel= 1, //定義每個點用多少位表示

.height = -1,

.width = -1,

//.vmode = FB_VMODE_NONINTERLACED,


};

static struct fb_fix_screeninfo zydzfb_fix __devinitdata = {

.id = "zydzfb",//設(shè)備名稱

.type = FB_TYPE_PACKED_PIXELS,

.visual = FB_VISUAL_MONO01 ,/* Monochr. 1=Black 0=White */

.line_length = DISPRAMBUFLSZ,

};


/*

* Initialization

*/


static int __devinit zydzfb_probe(struct platform_device *dev)

{

struct fb_info *info;

int err = 0;

info = framebuffer_alloc(0, &dev->dev);

if (!info)

return -ENOMEM;

info->fbops = &zydzfb_ops;

info->fix = zydzfb_fix;

info->fix.smem_start = virt_to_phys(rambuf_cur);

info->fix.smem_len = DISPRAMBUFSIZE;

info->var = zydzfb_var;

/* Virtual address */

info->screen_base = rambuf_cur;

info->screen_size = DISPRAMBUFSIZE;


err = fb_alloc_cmap(&info->cmap, 2, 0);


if (err < 0) {

framebuffer_release(info);

return err;

}


err = register_framebuffer(info);

if (err < 0) {

fb_dealloc_cmap(&info->cmap);

framebuffer_release(info);

return err;

}


platform_set_drvdata(dev, info);


/* now we have registered we can safely setup the hardware */

printk("display_ frame buffer alive and kicking !n");

retu

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉