2.4.2電子書fb.c文件

来源:http://www.cnblogs.com/CZM-/archive/2016/03/28/5330849.html
-Advertisement-
Play Games

顯示層面頭文件 定義結構體,為顯示統一標準 int (*DeviceInit)(void); 顯示類驅動初始化 int (*ShowPixel)(int iPenX, int iPenY, unsigned int dwColor); 對某一點進行瞄色 int (*CleanScreen)(unsi... ...


顯示層面頭文件

定義結構體,為顯示統一標準

int (*DeviceInit)(void);

顯示類驅動初始化

int (*ShowPixel)(int iPenX, int iPenY, unsigned int dwColor);

對某一點進行瞄色

int (*CleanScreen)(unsigned int dwBackColor);

清屏

int RegisterDispOpr(PT_DispOpr ptDispOpr);

註冊相應鏈表

 

#ifndef _DISP_MANAGER_H
#define _DISP_MANAGER_H

typedef struct DispOpr {
    char *name;
    int iXres;
    int iYres;
    int iBpp;
    int (*DeviceInit)(void);
    int (*ShowPixel)(int iPenX, int iPenY, unsigned int dwColor);
    int (*CleanScreen)(unsigned int dwBackColor);
    struct DispOpr *ptNext;
}T_DispOpr, *PT_DispOpr;

int RegisterDispOpr(PT_DispOpr ptDispOpr);
void ShowDispOpr(void);
int DisplayInit(void);
int FBInit(void);

#endif /* _DISP_MANAGER_H */

書寫規範 命名變數 全局為g 結構體為t 指針為p int型為i unsigned 為u 變數名單個單詞首字母大寫

static int FBDeviceInit(void);
static int FBShowPixel(int iPenX, int iPenY, unsigned int dwColor);
static int FBCleanScreen(unsigned int dwBackColor);

static int g_iFBFD;
struct fb_var_screeninfo g_tVar;    /* Current var */
struct fb_fix_screeninfo g_tFix;    /* Current fix */
static int g_iScreenSize;                    //????′óD?
static unsigned char * g_pucFBMem;
static int g_iLineWidth;
static int g_iPixelWidth;


/* 11?ìò????á11ì?£? éè??£?×¢2á */
//gè??? t?á11ì?
static T_DispOpr g_tFBispopr = {
    .name = "fb",
    .DeviceInit = FBDeviceInit();
    .ShowPixel = FBShowPixel();
    .CleanScreen = FBCleanScreen();

};

static int FBDeviceInit(void)
{
    
    g_iFBFD = open("FB_DEVICE_NAME",O_RDWR);
    if(g_iFBFD < 0)
    {
        DBG_PRINTF("can't open FB_DEVICE_NAME \n");
        return -1;
    }
    if(ioctl(g_iFBFD, FBIOGET_VSCREENINFO, &g_tVar))
    {
        DBG_PRINTF("can't get var \n");
        return -1;    
    }
    if(ioctl(g_iFBFD, FBIOGET_FSCREENINFO, &g_tFix))
    {
        DBG_PRINTF("can't get fix \n");
        return -1;    
    }

    g_tFBispopr.iXres = g_tVar.xres;
    g_tFBispopr.iYres = g_tVar.yres;
    g_tFBispopr.iBpp  = g_tVar.bits_per_pixel;
    
    g_iScreenSize = var.xres * var.yres * var.bits_per_pixel / 8;    //μ¥??×??ú
    
    g_pucFBMem = (unsigned char *)mmap(NULL, screen_size, \
        PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
    if(g_pucFBMem == (unsigned char *) -1)
    {
        DBG_PRINTF("can't mmap \n");
        return -1;
    }
    memset(g_pucFBMem, 0, g_iScreenSize);

    return 0;
}

static int FBShowPixel(int iPenX, int iPenY, unsigned int dwColor)
{
    unsigned char  *pucPen_8 = g_pucFBMem + iPenY * g_iLineWidth + iPenX * g_iPixelWidth;     //μ±?°??????ó|?ú′?????
    unsigned short *pwPen_16;
    unsigned int   *pdwPen_32;

    unsigned int red, blue, green;
    
    pwPen_16  = (unsigned short *)pucPen_8;
    pdwPen_32 = (unsigned int *)pucPen_8;
    
    switch( g_tFBispopr.iBpp )
    {
        case 8:
        {
            *pucPen_8 = dwColor;            //??ó|μ÷é?°???é?
            
            break;
        }
        case 16:
        {
            /* 5*6*5 */
            red   = (dwColor >> 16) & 0xff;
            green = (dwColor >> 8)  & 0xff;
            blue  = (dwColor >> 0)  & 0xff;

            dwColor = ((red >> 3 ) << 11) | ((green >> 2) << 5) | ( blue >> 3);
            
            /* ??é?êy?Y?a???? */
            *pwPen_16 = dwColor;
            
            break;
        }
        case 32:
        {
            *pdwPen_32 = dwColor;
            
            break;
        }
        
    }
    default:
    {
            DBG_PRINTF("can't surport %dbpp \n", g_tFBispopr.iBpp);
            return -1;
            break;
    }
    return 0;

}

static int FBCleanScreen(unsigned int dwBackColor)
{
    unsigned char  *pucPen_8 = g_pucFBMem;
    unsigned short *pwPen_16;
    unsigned int   *pdwPen_32;
    
    unsigned int red, blue, green;
    int i = 0;

    pwPen_16  = (unsigned short *)pucPen_8;
    pdwPen_32 = (unsigned int *)pucPen_8;
        
    switch( g_tFBispopr.iBpp )
    {
        case 8:
        {
            memset(pucPen_8, dwBackColor, g_iScreenSize);
            
            break;
        }
        case 16:
        {
            /* 5*6*5 */
            red   = (dwBackColor >> 16) & 0xff;
            green = (dwBackColor >> 8)  & 0xff;
            blue  = (dwBackColor >> 0)  & 0xff;

            dwBackColor = ((red >> 3 ) << 11) | ((green >> 2) << 5) | ( blue >> 3);
            for(i = 0 ; i< g_iScreenSize; i++)
            {
                *pwPen_16 = dwBackColor;
                pwPen_16 ++;
                i += 2;
            }
        
            
            break;
        }
        case 32:
        {
            for(i = 0 ; i< g_iScreenSize; i++)
            {
                *pdwPen_32 = dwBackColor;
                pdwPen_32 ++;
                i += 4;
            }            
            break;
        }
        
    }
    default:
    {
            DBG_PRINTF("can't surport %dbpp \n", g_tFBispopr.iBpp);
            return -1;
            break;
    }
    return 0;
    
}

int FBInit(void)
{
    RegisterDispOpr( &g_tFBispopr);
    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於硬體工程師來說,一些工具的使用也至關重要,工具使用的不當,往往導致得到的結果也是不正確的,可能會給硬體工程師一個錯誤的判斷。本章就會列舉出很多實用的關於硬體工程師必須要會的一些工具的使用方法和技巧。 測電源紋波 電源紋波如何測得?你設計的電源紋波多大?你怎麼降低電源的紋波和雜訊? 以上一系列問題 ...
  • 先登錄mysql ==》mysql -uroot -p 查看資料庫的版本 select version(); 查看有哪些庫 show datases; 查看當前處於哪個庫 select database(); 查看當前登錄用戶 select user(); 查看某個庫下麵的表; use db; sh ...
  • 最近一直在調試視頻 採集卡,和PC端連接的是USB介面,使用的是cypress的CY7C68013A-56PVXC,現列舉一下對於CY7C68013無法識別的可能存在原因。在設備管理器裡面顯示的VID/PID為全0。 上圖是CY7C68013A-56PVXC和EEPROM的最小系統。 若是按照上圖接 ...
  • 雖然ubuntu的中國伺服器的速度已經非常不錯,但是難免,會有網路不暢的情形,所以修改軟體源地址是一個基礎的知識點。 修改ubuntu的軟體源的方式有多種,一直是通過ubuntu軟體中心提供的UI,還有一種就是通過編輯/etc/apt/sources.list配置文件。 UI操作 通過軟體中心配置軟... ...
  • SCCM 部署操作系統 ,提示許可權問題,報錯:0xc00000098 這個問題通過查看日誌,論壇搜索,博客等。下麵是最終的解決方法: 1.檢查所有組件是否已安裝。(IIS組件等)。(分發站點證書是否正常) 2.在分發點將PEX鉤去掉。 3.卸載WDS重啟SCCM伺服器。 4.卸載管理組件。 5.卸載 ...
  • 自從甲骨文收購 MySQL 後,由於甲骨文對 MySQL 的開發和維護更多傾向於閉門的立場,很多 MySQL 的開發者和用戶放棄了它。在社區驅動下,促使更多人移到 MySQL 的另一個叫 MariaDB 的分支,在原有 MySQL 開發人員的帶領下,MariaDB 的開發遵循開源的理念,並確保它的二 ...
  • 之前的折騰過Windows下ssh的自動登錄,比如這篇Windows下使用Xshell建立反向隧道,但是這個不能無交互的情況下自動連接(比如在連接新主機時),也就很難在服務中使用。解決方法還是得使用命令行版本。 OpenSSH其實是有Windows版本的,並且目前還在維護:https://githu ...
  • 我們知道VMware的網路適配器類型有多種,例如E1000、VMXNET、VMXNET 2 (Enhanced)、VMXNET3等,就性能而言,一般VMXNET3要優於E1000,下麵介紹如果將Linux虛擬機的網路適配器類型從E1000改為VMXNET3。本文測試環境如下 操作系統 :Oracle... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...