lcd驅動程式

2021-06-26 12:28:27 字數 3617 閱讀 2407

ok6410lcd測試程式

1.在螢幕上分別顯示紅綠藍三個長方形:

/*自定義結構體用來在使用者空間裡管理幀緩衝的資訊*/  

typedef struct fd_dev  

fb_dev_t;  

/*實現緩衝裝置的開啟和關閉操作的介面*/  

int fb_open(fb_dev_t *fbd, char *fbn)  

/*獲取lcd的可變引數*/  

ioctl(fbd->fd, fbioget_vscreeninfo, &vinfo);  

//將可變引數的中的相關資料儲存到自定的結構體fbd中  

fbd->xres = vinfo.xres;  

fbd->yres = vinfo.yres;  

fbd->bpp  = vinfo.bits_per_pixel;  

fbd->siz  = fbd->xres * fbd->yres *fbd->bpp / 8;  

printf("%dx%d,%dbpp,screensize = %d\n", fbd->xres, fbd->yres, fbd->bpp, fbd->siz);  

/*將幀緩衝對映到記憶體*/  

fbd->pfb = mmap(0, fbd->siz, prot_read|prot_write, map_shared, fbd->fd,0);  

if((int)fbd->pfb == -1) 

return 0;  

}  int fb_close(fb_dev_t *fbd)  

/*填充制定的巨型區域*/  

int fb_drawrect(fb_dev_t *fbd, int x0, int y0, int w, int h, int color)  

return 0;  

}   

#endif  

#include "bmplib.h"  

#define fb_dev_name "/dev/fb0"  

#define red_color565 0x0f100  

#define green_color565 0x007e0  

#define blue_color565  0x0001f  

int main(int argc, char *argv)  

else  

printf("16 bits only!\n");  

//fb_drawbmp(fbd,0,0,argv[1]);  

fb_close(fbd);  

return 0;  

}  2.在lcd上顯示點陣圖bmplib.h

#ifndef bmplib_h  

#define bmplib_h  

typedef struct bmp_file_header_t;  

typedef struct bmp_info_header_t;  

/*bitmap格式的影象檔案會帶有54位元組的資訊頭,其中包含了影象和檔案的基本資訊, 

緊接在檔案頭之後的就是實際的影象資料*/  

typedef struct rgb_32_t;  

/*對位圖進行操作*/  

typedef structbmp_t;  

//字元形到整形的轉換  

int char_to_int(char *ch)  

/*開啟位圖操作*/  

int bmp_open(bmp_t *bmp, char *bmpn)  

read(bmp->fd, &fhr, sizeof(bmp_file_header_t));//讀取檔案頭  

read(bmp->fd, &ihr, sizeof(bmp_info_header_t));//讀取資訊頭  

bmp->width    = char_to_int(ihr.width);  

bmp->height   = char_to_int(ihr.height);  

bmp->bitcount = char_to_int(ihr.bitcount);//畫素位數  

bmp->siz      = (bmp->width * bmp->height * bmp->bitcount) / 8;  

printf("bmp->width = %d\n", bmp->width);  

printf("bmp->height = %d\n", bmp->height);  

printf("bmp->bitcount = %d\n", bmp->bitcount);  

printf("bmp->siz = %d\n", bmp->siz);  

bmp->data = malloc(bmp->siz);//為位圖資料分配儲存空間  

read(bmp->fd, bmp->data, bmp->siz);//讀取資料  

bmp->curp = (rgb_32_t *)bmp->data; //獲取當前畫素點  

return 0;      

}  int bmp_close(bmp_t *bmp)  

/* 因為開發板的幀緩衝區在驅動中被設定為16位資料表示乙個畫素點,因此需要對24或 

32位的點陣圖進行轉換,使用下面的函式 

*/  

static inline short transfer_to_16bit(char r, char g, char b)  

static inline short bmp_get_pixel_16bit(bmp_t *bmp)  

//移動到下一畫素點  

static inline void bmp_next_pixel(bmp_t *bmp)  

/*繪製位圖*/  

int fb_drawbmp(fb_dev_t *fbd, int x0, int y0, char *bmpn)  

*( (short*)(fbd->pfb) + y * fbd->xres+x ) = bmp_get_pixel_16bit(&bmp);  

bmp_next_pixel(&bmp);//移動到下一畫素點  

}  }  

bmp_close(&bmp);  

return 0;  

}  #endif  

測試程式:

lcd_bmp.c

#include "bmplib.h"  

#define fb_dev_name "/dev/fb0"  

#define red_color565 0x0f100  

#define green_color565 0x007e0  

#define blue_color565  0x0001f  

int main(int argc,char *argv)  

else 

printf("16 bits only!\n"); 

*/  

fb_drawbmp(fbd, 0, 0, argv[1]);  

fb_close(fbd);  

return 0;  

}  位圖程式測試方法,例如這裡有一張名為clock.bmp的

編譯上述檔案後生成lcd_bmp

執行如下命令:

./lcd_bmp clock.bmp

LCD驅動程式移植

對lcd的操作可以像串列埠一樣,通過終端裝置層的封裝 dev tty 裝置 來輸出內容,也可以通過frame buffer dev fb 裝置 直接在視訊記憶體上 繪製 影象。tty 終端裝置 和frame buffer驅動程式的框架 下面根據每層的檔案講解一下上圖 1 顯示驅動程式 2 鍵盤驅動程...

LCD裝置驅動程式

對螢幕進行抓屏 cp dev fb0 myfile.png 幀緩衝裝置的主裝置號29,次裝置號0 31,也就是dev fb0 dev fb31 填充乙個fbinfo結構。用register framebuffer fbinfo 將fbinfo結構註冊到核心,對於fbinfo結構,最基本的是fs op...

LCD驅動程式(一)

lcd顯示原理 在jz2440上,想要讓lcd顯示,需要幾個部分1 lcd硬體 2 開發板上的lcd控制器 3 sdram記憶體存放資料frambuffer 4 可能還需要乙個調色盤 實際上是一塊記憶體,裡面資料可以組成各種顏色 顯示原理 在開發板上操作lcd控制器,使得開發板向sdram記憶體裡去...