zoukankan      html  css  js  c++  java
  • 2.4.2电子书fb.c文件

    显示层面头文件

    定义结构体,为显示统一标准

    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 
    ");
            return -1;
        }
        if(ioctl(g_iFBFD, FBIOGET_VSCREENINFO, &g_tVar))
        {
            DBG_PRINTF("can't get var 
    ");
            return -1;    
        }
        if(ioctl(g_iFBFD, FBIOGET_FSCREENINFO, &g_tFix))
        {
            DBG_PRINTF("can't get fix 
    ");
            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 
    ");
            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 
    ", 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 
    ", g_tFBispopr.iBpp);
                return -1;
                break;
        }
        return 0;
        
    }
    
    int FBInit(void)
    {
        RegisterDispOpr( &g_tFBispopr);
        return 0;
    }
  • 相关阅读:
    如何区分 PaaS、IaaS 、SaaS?
    IP黑名单
    VMware vSphere 6 序列号
    什么是DMZ区域,DMZ区域的作用与原理
    PM2 进程管理工具
    解决Centos6 2021年后yum失效问题
    解决: Got permission denied while trying to connect to the Docker daemon socket
    Windows原版镜像
    使用LemonBench工具对Linux服务器进行综合评测
    使用 Packet Sender 发送TCP包
  • 原文地址:https://www.cnblogs.com/CZM-/p/5330849.html
Copyright © 2011-2022 走看看