裝置檔案是在/dev/目錄下
裝置檔案有主裝置號,次裝置號.
當操作裝置檔案, 系統會根據裝置檔案的裝置號找到相應的裝置驅動(驅動在核心註冊時已指定使用的裝置號),並呼叫相應的功能.
open ---> sys ----> driver ---> drv_open
read ---> sys ----> driver ---> drv_read
ioctl --> sys ----> driver ---> drv_ioctl
//一幅圖由很多行資料, 每行由很多個畫素點組成.
800x600: 表示600行, 每行800個畫素點
1024x768
1024x768x16: 表示共有768行, 每行1024個畫素點, 每個畫素點的資料占用16位
rgb565
1024x768x24: 表示共有768行, 每行1024個畫素點, 每個畫素點的資料占用24位
rgb888
1024x768x32: 表示共有768行, 每行1024個畫素點, 每個畫素點的資料占用32位
argb8888 a:透明度
每個畫素點表示乙個顏色, 乙個顏色由三基色(red, green, blue)組成. 也就是說乙個畫素點的資料位裡包含有r多少, g/b各是多少的資訊. r,g, b各占用不同的幾位來表示
256色:表示共有256種顏色, 每個畫素點資料占用乙個位元組(8位).
首先把圖里使用頻率最高的256種顏色做成乙個顏色表(每種顏色還是rgb888), 每個畫素點的資料不是記錄rgb的資料, 而是記錄對應顏色表裡的索引號
每個畫素點佔16bit(16位色):
rgb1555: rgb各占用5bit, 1bit可用於表示透明
rgb565: r占用高5位(11-15, g占用6位(5--10), b占用5位(0-4)
每個畫素點佔24bit(24位色):
rgb888: rgb各用8位
每個畫素點佔32bit(32位色):
rgb8888: rgb各占用8位, 最高8位用於透明度的表示
linux系統下, 沒有lcd驅動. 對應的驅動應叫framebuffer驅動(視訊記憶體).
驅動好後, 對應裝置檔案應是/dev/fb*
視訊記憶體: 就是在記憶體裡分出乙個區域,專用於畫出要顯示的影象(如視窗系統等). 而lcd的顯示是由dma控制器自動從這個區域裡把rgb資料搬到lcd控制器裡顯示的
dma控制器:就是資料的搬運工, 只要設好從**搬,搬到**去. 就可以自動迴圈工作.
我們要顯示乙個或乙個視窗,只需要改變視訊記憶體裡的資料就可以了
struct fb_info 的乙個物件表示乙個framebuffer裝置
struct fb_info結構體成員比較多, 最起碼需要初始化下面列出的幾個成員:
struct fb_info fbi ;
struct fb_var_screeninfo
struct fb_fix_screeninfo
ioctl函式用於從驅動裡獲取相應的配置資訊; 或者把配置資訊傳遞給驅動,讓驅動根據相應的配置資訊來設定硬體
int ioctl(int fd, int request, ...); //返回值為0表示執行成功,-1表示執行失敗
fd表示開啟裝置檔案獲取到的檔案描述符
request表示告訴驅動需要做什麼操作. 具體的值是由驅動與應用程式約定好的
...不定引數.
man 2 ioctl_list //檢視系統裡常用的ioctl命令
tes1:
struct fb_fix_screeninfo finfo;
ioctl(fd, fbioget_fscreeninfo, &finfo)
printf("id = %s\n", finfo.id);
printf("line length = %d\n", finfo.line_length);
結果:id = svgadrmfb
line length = 5120 //1280*4
test2:
struct fb_var_screeninfo vinfo;
ioctl(fd, fbioget_vscreeninfo, &vinfo);
printf("x = %d, y = %d\n", vinfo.xres, vinfo.yres);
printf("bits_per_pixel = %d\n", vinfo.bits_per_pixel);
printf("red : offset = %d, length = %d\n", vinfo.red.offset, vinfo.red.length);
printf("green : offset = %d, length = %d\n", vinfo.green.offset, vinfo.green.length);
printf("blue : offset = %d, length = %d\n", vinfo.blue.offset, vinfo.blue.length);
printf("transp : offset = %d, length = %d\n", vinfo.transp.offset, vinfo.transp.length);
tetst2結果:
x = 1280, y = 768
bits_per_pixel = 32
red : offset = 16, length = 8
green : offset = 8, length = 8
blue : offset = 0, length = 8
transp : offset = 0, length = 0
///bmp檔案裡面除了256色的檔案外, 裡面每個畫素存放的都是rgb資料和乙個檔案頭.
24bit的bmp檔案大小: 檔案頭54位元組+解析度*3位元組每個畫素
注意:bmp檔案裡存放的資料是反著的, 要正確顯示,需要把圖中的第0行放到視訊記憶體裡的最後一行, 圖里的第一行放到視訊記憶體裡的倒數第一行, 圖里的第二行放到屏的倒數第二行....
Linux作業系統基礎知識
linux作業系統 linux概述 是乙個開源的作業系統 linux一次代表的是linux核心 創始人 林納斯托瓦斯 linux 兩大髮型版本 red hat 一般在伺服器上使用 debian linux作業系統安裝 nat模式 把自己電腦看成路由器,然後只能自己本機和虛擬機器通訊,或者是多個虛擬機...
Linux作業系統基礎知識
一 linux的體系結構 核心空間 kernel space 核心空間又包括系統呼叫介面 system call inte ce 核心 kernel 平台架構相關的 architecture dependent kernel code 注 使用者空間和核心空間是程式執行的兩種不同的狀態,我們可以通過...
Linux 作業系統基礎知識
基於馮諾伊曼體系,將計算機分為5大組成部分 運算器 也叫算數邏輯單元,完成對資料的各種常規運算,如加減乘除,也包括邏輯運算,移位,比較等。要注意pc機32位或64位表示的是運算器計算能力,alu的寬度,一次計算能夠計算的資料的位數。控制器 它是整個計算機系統的控制中心,它指揮計算機各部分協調工作,保...