1,概念
寧洱ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
電子槍:用來打像素點
像素點:即分辨率
RGD:三原色 在計算機領域中,每個像素點又RGB三原色組成像素點的要素值。屏幕上的一個點對應一個具體的數(shù)值,該初始值包含紅綠藍三者的值
顯存:它會從DDRAM中劃出一部分當顯存用,操作LCD就變成操作顯存和LCD對應的值。那我們LCD驅(qū)動主要工作就是配置LCD控制器,往顯卡中傳輸要在LED上顯示的內(nèi)容,
LCD驅(qū)動開發(fā)的主要工作:申請顯存,配置LED控制器,讓LED控制器自動的,周期性的,讀取顯存中的數(shù)據(jù),按照一定的時序(點和點時間間隔,換行時間,換屏時間)將讀取到的數(shù)據(jù)發(fā)送給LCD屏LCD硬件會完成像素點的顯示,也就是配置他們之間傳數(shù)據(jù)要和它打點速度兼容
framebuffer:導出LCD物理緩沖區(qū)(顯存)到用戶空間(0~3G),用戶空間要顯示一副圖像到LCD屏,在用戶空間直接操作顯存,在用戶空間直接操作顯存,將要顯示的圖像拷貝到顯存中的相應位置,要實現(xiàn)mmap
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/mmap.h>
#include<linux/fb.h>
srtuct fb_fix_screeninfo?。妫猓妫椋。健。埃?/p>
struct?。妫猓撸觯幔颍撸螅悖颍澹澹睿椋睿妫铩。妫猓觯幔颉。健。埃?;
int?。妫猓常病。健。危眨蹋?;
#define?。茫希蹋希遥撸遥牛摹。埃埃埃妫妫埃埃埃?/p>
#define?。茫希蹋希遥撸牵遥牛牛巍。埃兀埃埃埃埃疲疲埃?/p>
#define COLOR_BLUE ?。埃兀埃埃埃埃埃埃疲?/p>
/*記錄顯存大?。?/p>
long?。螅悖颍澹澹睿螅椋濉。健。?;
int?。恚幔椋睿ǎ?/p>
{
intfd?。健。?;
?。椋睿簟。。健。埃?/p>
?。椋睿簟。。健。?;
fd?。健。铮穑澹睿?/p>
?。妫洹。健。铮穑澹睿ǎⅲ洌澹觯妫猓埃ⅲ?/p>
if(fd<0)
{
?。穑颍椋睿簦妫ǎⅲ铮穑澹睢。洌澹觯妫猓埃。妫幔椋欤澹?!?。埽睿ⅲ?/p>
?。颍澹簦酰颍睢。?;
}
/*獲取屏幕固定信息*/
ioctl(fd,FBIOGET_FSCREENINFO,&fbfox);
/*獲得屏幕可變信息*/
ioctl(fd,FBIOGET_VSCREENINFO,&fbvar);
screensize?。健。妫猓觯幔颍颍澹蟆。妫猓觯幔颍颍澹蟆。ǎ妫猓觯幔颍猓椋簦螅撸穑澹颍撸穑椋澹欤?;
fb32?。健。恚恚幔穑ǎ?,screensize,PROT_READ,MAP_SHARED,fd,0);
if(fb32?。健。剑危眨蹋蹋?/p>
{
?。穑颍椋睿簦妫ǎⅲ恚恚幔稹。妫颍幔恚澹猓酰妫妫澹颉。簦铩。酰螅澹颉。螅穑幔悖濉。妫幔椋欤澹?!?。埽睿ⅲ?;
return?。?;
}
/*操作顯存*/
if(fbvar.bits_per_pixel?。剑剑福?/p>
{
printf("starting 8?。猓穑稹。妫颍幔恚澹猓酰妫妫澹颉。簦澹螅簟。。埽睿ⅲ?;
}
else?。椋妫ǎ妫猓觯幔颍猓椋簦螅撸穑澹颍撸穑椋澹臁。剑剑保叮?/p>
{
printf("starting?。保丁。猓穑稹。妫颍幔恚澹猓酰妫妫澹颉。簦澹螅簟。。埽睿ⅲ?/p>
}
if(fbvar.bits_per_pixel?。剑剑玻矗?/p>
{
printf("starting 24?。猓穑稹。妫颍幔恚澹猓酰妫妫澹颉。簦澹螅簟。。埽睿ⅲ?;
}
if(fbvar.bits_per_pixel?。剑剑常玻?/p>
{
printf("starting 32?。猓穑稹。妫颍幔恚澹猓酰妫妫澹颉。簦澹螅簟。。埽睿ⅲ?;
for(;y<fbvar.yres/3;y++)
{
for(x=0;x<fbvar.xres;x++)
{
*(fb32?。。妫猓觯幔颍颍澹螅健。茫希蹋希遥撸遥牛?;
}
}
for(;y<fbvar.yres2/3;y++)
{
for(x=0;x<fbvar.xres;x++)
{
?。ǎ妫猓常病。。妫猓觯幔颍颍澹螅健。茫希蹋希遥撸牵遥牛牛?;
}
}
for(;y<fbvar.yres;y++)
{
for(x=0;x<fbvar.xres;x++)
{
?。ǎ妫猓常病。。妫猓觯幔颍颍澹螅健。茫希蹋希遥撸拢蹋眨?;
}
munmap(fd32,screensize);
close(fd);
return?。?;
}
一般芯片把不確定的信息變成可調(diào)節(jié)的信息
LCD 管腳:VD0~VD23:數(shù)據(jù)管腳 傳送RGB
HSYNC:當該管腳收到信號是,電子槍由最右端跳回最左端
VSYNC:該管腳收到信號時,電子槍由右下角跳回左上角
VCLK::每個VCLK信號使電子槍跳到下一個像素點
VNEN:視頻數(shù)據(jù)使能電子槍接收VD0~VD23上的數(shù)據(jù)。
3.時序圖
HSPW:水平同步脈沖寬度
HBPD:從水平同步信號到下一行有效信號的寬度,即電子槍從最右端回到最左端的時間
HOZVAL:一行像素個數(shù)
HFPD:打完一行像素到下一個水平同步信號,
VSPW垂直同步脈沖寬度
VBPD:一針結(jié)束后,垂直同步信號以后的無效行數(shù)
LINEVAL:一共有多少行
VFPD:一針結(jié)束后,垂直同步信號以前的無效行數(shù)
極性:信號的極性根據(jù)外接LCD相應極性可配置
linux中framebuffer框架
linux下LCD驅(qū)動開發(fā)的最主要數(shù)據(jù)結(jié)構(gòu)
struct fb_info{
atomic_t count;
int node;
int flags;
struct mutex lock;/* Lock for open/release/ioctl funcs */
struct mutex mm_lock;/* Lock for fb_mmap and smem_* fields */
struct fb_var_screeninfo var;/* Current var */
struct fb_fix_screeninfo fix;/* Current fix */
struct fb_monspecs monspecs;/* Current Monitor specs */
struct work_struct queue;/* Framebuffer event queue */
struct fb_pixmap pixmap;/* Image hardware mapper */
struct fb_pixmap sprite;/* Cursor hardware mapper */
struct fb_cmap cmap;/* Current cmap */
struct list_head modelist; /* mode list */
struct fb_videomode *mode;/* current mode */
struct fb_ops *fbops; //重點
#endif
char __iomem *screen_base;/* Virtual address *///顯存的起始虛擬地址3G~4G
unsigned long screen_size;/* Amount of ioremapped VRAM or 0 */ //記錄顯存大小
}
struct fb_var_screeninfo {
__u32 xres;/* visible resolution*/
__u32 yres;
__u32 xres_virtual;/* virtual resolution*/
__u32 yres_virtual;
__u32 xoffset;/* offset from virtual to visible */
__u32 yoffset;/* resolution*/
__u32 bits_per_pixel;/* guess what*/
__u32 grayscale;/* != 0 Graylevels instead of colors */
struct fb_bitfield red;/* bitfield in fb mem if true color, */
struct fb_bitfield green;/* else only length is significant */
struct fb_bitfield blue;
struct fb_bitfield transp;
}
struct fb_fix_screeninfo {
char id[16];/* identification string eg "TT Builtin" */
unsigned long smem_start;/* Start of frame buffer mem */顯存的起始位置且是物理的
/* (physical address) */
__u32 smem_len;/* Length of frame buffer mem */顯存大小
__u32 type;/* see FB_TYPE_**/
__u16 reserved[3];/* Reserved for future compatibility */
};
如果要自己寫個LCD驅(qū)動,框架應該怎么寫
1)分配一個fb_info
s3cfb_alloc_framebffer()
2)設置/填充該結(jié)構(gòu)體
3)初始化硬件 如:配置GPIO管腳功能,時序初始化配置,申請顯存,將申請到的顯存起始地址告訴LCD控制器
4)注冊fb_info結(jié)構(gòu)
s3cfb_register_framebuffer(...);
5)內(nèi)核中的驅(qū)動程序
通過make menuconfig可以得到一個路徑和變量。我的變量和路徑是:Graphics support->Support for frame buffer devices(S5P Framebuffer support (Defined at drivers/video/samsung/Kconfig:5 CONFIG_FB_S5P ) ) Select LCD Type (WA101S)(CONFIG_FB_S5P_WA101S)
->Select LCD Type
平臺設備總線架構(gòu)
bus
device:evs.c
driver:s3cfb.c
資源 static struct resource s3cfb_resource={}
platfirm_data
核心文件是 fbmen.c
s3cfb.c s3cfb_fimd6x.c
s3cfb.c ->需要完成的驅(qū)動程序 ,s3cfb_fimd6x.c封裝了功能函數(shù),供s3cfb.c調(diào)用
LCD手冊中
thpw:1~40:20
thb:46
HBPD:46-20
s3cfb_init_global(fbdev)
{
s3cfb_set_polarity(ctrl);
s3cfb_set_timing(ctrl);
}
struct file_operations fb_fops
{
.opem
.read
.write
.mmap
.ioctl
}
找對應關系的算法register_fb[minor] =fb_info
用戶空間 open()
fb_ops.open()
{
看/dev/fbn對應的fb_info.fbops->ops
存在則調(diào)用fb_info.fbops->open不存在執(zhí)行默認操作
}
5驅(qū)動程序要驅(qū)動的硬件和CPU連接方式
1,gpio連接
2. 類似于內(nèi)存接口,有數(shù)據(jù)線,地址線,控制線BANK
3,協(xié)議類接口
文章名稱:LCD驅(qū)動
本文網(wǎng)址:http://bm7419.com/article32/pccipc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、域名注冊、定制開發(fā)、服務器托管、網(wǎng)頁設計公司、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)