日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

S3C2440上LCD驅(qū)動(FrameBuffer)實例開發(fā)講解(一)

 昵稱9508535 2012-04-10

一、開發(fā)環(huán)境

  • 主  機:VMWare--Fedora 9
  • 開發(fā)板:Mini2440--64MB Nand, Kernel:2.6.30.4
  • 編譯器:arm-linux-gcc-4.3.2

二、背景知識

1. LCD工作的硬件需求:
   要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動器,而且還需要相應(yīng)的LCD控制器。在通常情況下,生產(chǎn)廠商把LCD驅(qū)動器會以COF/COG的 形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來實現(xiàn),現(xiàn)在很多的MCU內(nèi)部都集成了LCD控制器,如S3C2410/2440等。通 過LCD控制器就可以產(chǎn)生LCD驅(qū)動器所需要的控制信號來控制STN/TFT屏了。
 
2. S3C2440內(nèi)部LCD控制器結(jié)構(gòu)圖:
我們根據(jù)數(shù)據(jù)手冊來描述一下這個集成在S3C2440內(nèi)部的LCD控制器:
a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成;
b:REGBANK由17個可編程的寄存器組和一塊256*16的調(diào)色板內(nèi)存組成,它們用來配置LCD控制器的;
c:LCDCDMA是一個專用的DMA,它能自動地把在偵內(nèi)存中的視頻數(shù)據(jù)傳送到LCD驅(qū)動器,通過使用這個DMA通道,視頻數(shù)據(jù)在不需要CPU的干預(yù)的情況下顯示在LCD屏上;
d:VIDPRCS接收來自LCDCDMA的數(shù)據(jù),將數(shù)據(jù)轉(zhuǎn)換為合適的數(shù)據(jù)格式,比如說4/8位單掃,4位雙掃顯示模式,然后通過數(shù)據(jù)端口VD[23:0]傳送視頻數(shù)據(jù)到LCD驅(qū)動器;
e:TIMEGEN由可編程的邏輯組成,他生成LCD驅(qū)動器需要的控制信號,比如VSYNC、HSYNC、VCLK和LEND等等,而這些控制 信號又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關(guān),通過不同的配置,TIMEGEN就能產(chǎn)生這些信號的不同形態(tài),從而支 持不同的LCD驅(qū)動器(即不同的STN/TFT屏)。
 
3. 常見TFT屏工作時序分析:
LCD提供的外部接口信號:

VSYNC/VFRAME/STV:垂直同步信號(TFT)/幀同步信號(STN)/SEC TFT信號;
HSYNC/VLINE/CPV:水平同步信號(TFT)/行同步脈沖信號(STN)/SEC TFT信號;
VCLK/LCD_HCLK:象素時鐘信號(TFT/STN)/SEC TFT信號;
VD[23:0]:LCD像素數(shù)據(jù)輸出端口(TFT/STN/SEC TFT);
VDEN/VM/TP:數(shù)據(jù)使能信號(TFT)/LCD驅(qū)動交流偏置信號(STN)/SEC TFT 信號;
LEND/STH:行結(jié)束信號(TFT)/SEC TFT信號;
LCD_LPCOE:SEC TFT OE信號;
LCD_LPCREV:SEC TFT REV信號;
LCD_LPCREVB:SEC TFT REVB信號。

 
所有顯示器顯示圖像的原理都是從上到下,從左到右的。這是什么意思呢?這么說吧,一副圖像可以看做是一個矩形,由很多排列整齊的點一行一行組成,這些點稱之為像素。那么這幅圖在LCD上的顯示原理就是:

A:顯示指針從矩形左上角的第一行第一個點開始,一個點一個點的在LCD上顯示,在上面的時序圖上用時間線表示就為VCLK,我們稱之為像素時鐘信號;
B:當(dāng)顯示指針一直顯示到矩形的右邊就結(jié)束這一行,那么這一行的動作在上面的時序圖中就稱之為1 Line;
C:接下來顯示指針又回到矩形的左邊從第二行開始顯示,注意,顯示指針在從第一行的右邊回到第二行的左邊是需要一定的時間的,我們稱之為行切換;
D:如此類推,顯示指針就這樣一行一行的顯示至矩形的右下角才把一副圖顯示完成。因此,這一行一行的顯示在時間線上看,就是時序圖上的HSYNC;
E:然 而,LCD的顯示并不是對一副圖像快速的顯示一下,為了持續(xù)和穩(wěn)定的在LCD上顯示,就需要切換到另一幅圖上(另一幅圖可以和上一副圖一樣或者不一樣,目 的只是為了將圖像持續(xù)的顯示在LCD上)。那么這一副一副的圖像就稱之為幀,在時序圖上就表示為1 Frame,因此從時序圖上可以看出1 Line只是1 Frame中的一行;
F:同樣的,在幀與幀切換之間也是需要一定的時間的,我們稱之為幀切換,那么LCD整個顯示的過程在時間線上看,就可表示為時序圖上的VSYNC。

 
上面時序圖上各時鐘延時參數(shù)的含義如下:(這些參數(shù)的值,LCD產(chǎn)生廠商會提供相應(yīng)的數(shù)據(jù)手冊)

VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以后的無效的行數(shù),對應(yīng)驅(qū)動中的upper_margin;
VFBD(vertical front porch):表示在一幀圖像結(jié)束后,垂直同步信號以前的無效的行數(shù),對應(yīng)驅(qū)動中的lower_margin;
VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數(shù)計算,對應(yīng)驅(qū)動中的vsync_len;
HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數(shù)據(jù)開始之間的VCLK的個數(shù),對應(yīng)驅(qū)動中的left_margin;
HFPD(horizontal front porth):表示一行的有效數(shù)據(jù)結(jié)束到下一個水平同步信號開始之間的VCLK的個數(shù),對應(yīng)驅(qū)動中的right_margin;
HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應(yīng)驅(qū)動中的hsync_len;

 
對于以上這些參數(shù)的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對寄存器的操作請查看S3c2440數(shù)據(jù)手冊LCD部分)

LCDCON1:17 - 8位CLKVAL
          6 - 5位掃描模式(對于STN屏:4位單/雙掃、8位單掃)
          4 - 1位色位模式(1BPP、8BPP、16BPP等)

LCDCON2:31 - 24位VBPD
         23 - 14位LINEVAL
         13 - 6位VFPD
          5 - 0位VSPW

LCDCON3:25 - 19位HBPD
         18 - 8位HOZVAL
          7 - 0位HFPD

LCDCON4: 7 - 0位HSPW

LCDCON5:

 
4. 幀緩沖(FrameBuffer):
   幀緩沖是Linux為顯示設(shè)備提供的一個接口,它把一些顯示設(shè)備描述成一個緩沖區(qū),允許應(yīng)用程序通過 FrameBuffer定義好的接口訪問這些圖形設(shè)備,從而不用去關(guān)心具體的硬件細(xì)節(jié)。對于幀緩沖設(shè)備而言,只要在顯示緩沖區(qū)與顯示點對應(yīng)的區(qū)域?qū)懭腩伾? 值,對應(yīng)的顏色就會自動的在屏幕上顯示。下面來看一下在不同色位模式下緩沖區(qū)與顯示點的對應(yīng)關(guān)系:

、幀緩沖(FrameBuffer)設(shè)備驅(qū)動結(jié)構(gòu)
 
     幀 緩沖設(shè)備為標(biāo)準(zhǔn)的字符型設(shè)備,在Linux中主設(shè)備號29,定義在/include/linux/major.h中的FB_MAJOR,次設(shè)備號定義幀緩 沖的個數(shù),最大允許有32個FrameBuffer,定義在/include/linux/fb.h中的FB_MAX,對應(yīng)于文件系統(tǒng)下/dev /fb%d設(shè)備文件。

1. 幀緩沖設(shè)備驅(qū)動在Linux子系統(tǒng)中的結(jié)構(gòu)如下:

我 們從上面這幅圖看,幀緩沖設(shè)備在Linux中也可以看做是一個完整的子系統(tǒng),大體由fbmem.c和xxxfb.c組成。向上給應(yīng)用程序提供完善的設(shè)備文 件操作接口(即對FrameBuffer設(shè)備進行read、write、ioctl等操作),接口在Linux提供的fbmem.c文件中實現(xiàn);向下提供 了硬件操作的接口,只是這些接口Linux并沒有提供實現(xiàn),因為這要根據(jù)具體的LCD控制器硬件進行設(shè)置,所以這就是我們要做的事情了(即xxxfb.c 部分的實現(xiàn))。

2. 幀緩沖相關(guān)的重要數(shù)據(jù)結(jié)構(gòu):
   從幀緩沖設(shè)備驅(qū)動程序結(jié)構(gòu) 看,該驅(qū)動主要跟fb_info結(jié)構(gòu)體有關(guān),該結(jié)構(gòu)體記錄了幀緩沖設(shè)備的全部信息,包括設(shè)備的設(shè)置參數(shù)、狀態(tài)以及對底層硬件操作的函數(shù)指針。在Linux 中,每一個幀緩沖設(shè)備都必須對應(yīng)一個fb_info,fb_info在/linux/fb.h中的定義如下:(只列出重要的一些)

struct fb_info {
    int node;
    int flags;
    struct fb_var_screeninfo var;/*LCD可變參數(shù)結(jié)構(gòu)體*/
    struct fb_fix_screeninfo fix;/*LCD固定參數(shù)結(jié)構(gòu)體*/
    struct fb_monspecs monspecs; /*LCD顯示器標(biāo)準(zhǔn)*/
    struct work_struct queue;    /*幀緩沖事件隊列*/
    struct fb_pixmap pixmap;     /*圖像硬件mapper*/
    struct fb_pixmap sprite;     /*光標(biāo)硬件mapper*/
    struct fb_cmap cmap;         /*當(dāng)前的顏色表*/
    struct fb_videomode *mode;   /*當(dāng)前的顯示模式*/

#ifdef CONFIG_FB_BACKLIGHT
    
struct backlight_device *bl_dev;/*對應(yīng)的背光設(shè)備*/
    struct mutex bl_curve_mutex;
    u8 bl_curve[FB_BACKLIGHT_LEVELS];/*背光調(diào)整*/
#endif
#ifdef CONFIG_FB_DEFERRED_IO
    struct delayed_work deferred_work;
    struct fb_deferred_io *fbdefio;
#endif

    struct fb_ops *fbops; /*對底層硬件操作的函數(shù)指針*/
    struct device *device;
    struct device *dev;   /*fb設(shè)備*/
    int class_flag;    
#ifdef CONFIG_FB_TILEBLITTING
    struct fb_tile_ops *tileops; /*圖塊Blitting*/
#endif
    char __iomem *screen_base;   /*虛擬基地址*/
    unsigned long screen_size;   /*LCD IO映射的虛擬內(nèi)存大小*/
    void *pseudo_palette;        /*偽16色顏色表*/
#define FBINFO_STATE_RUNNING    0
#define FBINFO_STATE_SUSPENDED  1
    u32 state;  /*LCD的掛起或恢復(fù)狀態(tài)*/
    void *fbcon_par;
    void *par;    
};

其中,比較重要的成員有struct fb_var_screeninfo var、struct fb_fix_screeninfo fix和struct fb_ops *fbops,他們也都是結(jié)構(gòu)體。下面我們一個一個的來看。

fb_var_screeninfo結(jié)構(gòu)體主要記錄用戶可以修改的控制器的參數(shù),比如屏幕的分辨率和每個像素的比特數(shù)等,該結(jié)構(gòu)體定義如下:

struct fb_var_screeninfo {
    __u32 xres;                /*可見屏幕一行有多少個像素點*/
    __u32 yres;                /*可見屏幕一列有多少個像素點*/
    __u32 xres_virtual;        /*虛擬屏幕一行有多少個像素點*/        
    __u32 yres_virtual;        /*虛擬屏幕一列有多少個像素點*/
    __u32 xoffset;             /*虛擬到可見屏幕之間的行偏移*/
    __u32 yoffset;             /*虛擬到可見屏幕之間的列偏移*/
    __u32 bits_per_pixel;      /*每個像素的位數(shù)即BPP*/
    __u32 grayscale;           /*非0時,指的是灰度*/

    struct fb_bitfield red;    /*fb緩存的R位域*/
    struct fb_bitfield green;  /*fb緩存的G位域*/
    struct fb_bitfield blue;   /*fb緩存的B位域*/
    struct fb_bitfield transp; /*透明度*/    

    __u32 nonstd;              /* != 0 非標(biāo)準(zhǔn)像素格式*/
    __u32 activate;                
    __u32 height;              /*高度*/
    __u32 width;               /*寬度*/
    __u32 accel_flags;    

    /*定時:除了pixclock本身外,其他的都以像素時鐘為單位*/
    __u32 pixclock;            /*像素時鐘(皮秒)*/
    __u32 left_margin;         /*行切換,從同步到繪圖之間的延遲*/
    __u32 right_margin;        /*行切換,從繪圖到同步之間的延遲*/
    __u32 upper_margin;        /*幀切換,從同步到繪圖之間的延遲*/
    __u32 lower_margin;        /*幀切換,從繪圖到同步之間的延遲*/
    __u32 hsync_len;           /*水平同步的長度*/
    __u32 vsync_len;           /*垂直同步的長度*/
    __u32 sync;
    __u32 vmode;
    __u32 rotate;
    __u32 reserved[5];         /*保留*/
};

而fb_fix_screeninfo結(jié)構(gòu)體又主要記錄用戶不可以修改的控制器的參數(shù),比如屏幕緩沖區(qū)的物理地址和長度等,該結(jié)構(gòu)體的定義如下:

struct fb_fix_screeninfo {
    char id[16];                /*字符串形式的標(biāo)示符 */
    unsigned long smem_start;   /*fb緩存的開始位置 */
    __u32 smem_len;             /*fb緩存的長度 */
    __u32 type;                 /*看FB_TYPE_* */
    __u32 type_aux;             /*分界*/
    __u32 visual;               /*看FB_VISUAL_* */
    __u16 xpanstep;             /*如果沒有硬件panning就賦值為0 */
    __u16 ypanstep;             /*如果沒有硬件panning就賦值為0 */
    __u16 ywrapstep;            /*如果沒有硬件ywrap就賦值為0 */
    __u32 line_length;          /*一行的字節(jié)數(shù) */
    unsigned long mmio_start;   /*內(nèi)存映射IO的開始位置*/
    __u32 mmio_len;             /*內(nèi)存映射IO的長度*/
    __u32 accel;
    __u16 reserved[3];          /*保留*/
};

fb_ops結(jié)構(gòu)體是對底層硬件操作的函數(shù)指針,該結(jié)構(gòu)體中定義了對硬件的操作有:(這里只列出了常用的操作)

struct fb_ops {

    struct module *owner;

    
//檢查可變參數(shù)并進行設(shè)置
    int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);

    
//根據(jù)設(shè)置的值進行更新,使之有效
    int (*fb_set_par)(struct fb_info *info);

    
//設(shè)置顏色寄存器
    int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
             unsigned blue, unsigned transp, struct fb_info *info);

    
//顯示空白
    int (*fb_blank)(int blank, struct fb_info *info);

    
//矩形填充
    void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);

    
//復(fù)制數(shù)據(jù)
    void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);

    
//圖形填充
    void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);
};

3. 幀緩沖設(shè)備作為平臺設(shè)備:
   在S3C2440中,LCD控制器被集成在芯片的內(nèi)部作為一個相對獨立的單元,所以Linux把它看做是一個平臺設(shè)備,故在內(nèi)核代碼/arch/arm/plat-s3c24xx/devs.c中定義有LCD相關(guān)的平臺設(shè)備及資源,代碼如下:

/* LCD Controller */

//LCD控制器的資源信息
static struct resource s3c_lcd_resource[] = {
    [0] = {
        .start = S3C24XX_PA_LCD
, //控制器IO端口開始地址
        .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,//控制器IO端口結(jié)束地址
        .flags = IORESOURCE_MEM,//標(biāo)識為LCD控制器IO端口,在驅(qū)動中引用這個就表示引用IO端口
    },
    [1] = {
        .start = IRQ_LCD
,//LCD中斷
        .end = IRQ_LCD,
        .flags = IORESOURCE_IRQ
,//標(biāo)識為LCD中斷
    }
};

static u64 s3c_device_lcd_dmamask = 0xffffffffUL;

struct platform_device s3c_device_lcd = {
    .name         = "s3c2410-lcd"
,//作為平臺設(shè)備的LCD設(shè)備名
    .id         = -1,
    .num_resources = ARRAY_SIZE(s3c_lcd_resource)
,//資源數(shù)量
    .resource     = s3c_lcd_resource,//引用上面定義的資源
    .dev = {
        .dma_mask = &s3c_device_lcd_dmamask,
        .coherent_dma_mask = 0xffffffffUL
    }
};

EXPORT_SYMBOL(s3c_device_lcd)
;//導(dǎo)出定義的LCD平臺設(shè)備,好在mach-smdk2440.c的smdk2440_devices[]中添加到平臺設(shè)備列表中


   除此之外,Linux還在/arch/arm/mach-s3c2410/include/mach/fb.h中為LCD平臺設(shè)備定義了一個 s3c2410fb_mach_info結(jié)構(gòu)體,該結(jié)構(gòu)體主要是記錄LCD的硬件參數(shù)信息(比如該結(jié)構(gòu)體的s3c2410fb_display成員結(jié)構(gòu)中 就用于記錄LCD的屏幕尺寸、屏幕信息、可變的屏幕參數(shù)、LCD配置寄存器等),這樣在寫驅(qū)動的時候就直接使用這個結(jié)構(gòu)體。下面,我們來看一下內(nèi)核是如果 使用這個結(jié)構(gòu)體的。在/arch/arm/mach-s3c2440/mach-smdk2440.c中定義有:

/* LCD driver info */

//LCD硬件的配置信息,注意這里我使用的LCD是NEC 3.5寸TFT屏,這些參數(shù)要根據(jù)具體的LCD屏進行設(shè)置
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {

    //這個地方的設(shè)置是配置LCD寄存器5,這些宏定義在regs-lcd.h中,計算后二進制為:111111111111,然后對照數(shù)據(jù)手冊上LCDCON5的各位來看,注意是從右邊開始
    .lcdcon5 = S3C2410_LCDCON5_FRM565 |
               S3C2410_LCDCON5_INVVLINE |
               S3C2410_LCDCON5_INVVFRAME |
               S3C2410_LCDCON5_PWREN |
               S3C2410_LCDCON5_HWSWP,

    .type    = S3C2410_LCDCON1_TFT
,//TFT類型

    /* NEC 3.5'' */
    .width        = 240
,//屏幕寬度
    .height       = 320,//屏幕高度

    //以下一些參數(shù)在上面的時序圖分析中講到過,各參數(shù)的值請跟據(jù)具體的LCD屏數(shù)據(jù)手冊結(jié)合上面時序分析來設(shè)定
    .pixclock     = 100000,//像素時鐘
    .xres         = 240,//水平可見的有效像素
    .yres         = 320,//垂直可見的有效像素
    .bpp          = 16,//色位模式
    .left_margin  = 19,//行切換,從同步到繪圖之間的延遲
    .right_margin = 36,//行切換,從繪圖到同步之間的延遲
    .hsync_len    = 5,//水平同步的長度
    .upper_margin = 1,//幀切換,從同步到繪圖之間的延遲
    .lower_margin = 5,//幀切換,從繪圖到同步之間的延遲
    .vsync_len    = 1,//垂直同步的長度
};

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
    .displays        = &smdk2440_lcd_cfg
,//應(yīng)用上面定義的配置信息
    .num_displays    = 1,
    .default_display = 0,

    .gpccon          = 0xaaaa555a,//將GPC0、GPC1配置成LEND和VCLK,將GPC8-15配置成VD0-7,其他配置成普通輸出IO口
    .gpccon_mask     = 0xffffffff,
    .gpcup           = 0x0000ffff,//禁止GPIOC的上拉功能
    .gpcup_mask      = 0xffffffff,
    .gpdcon          = 0xaaaaaaaa,//將GPD0-15配置成VD8-23
    .gpdcon_mask     = 0xffffffff,
    .gpdup           = 0x0000ffff,//禁止GPIOD的上拉功能
    .gpdup_mask      = 0xffffffff,

    .lpcsel          = 0x0,//這個是三星TFT屏的參數(shù),這里不用
};

注意:可能有很多朋友不知道上面紅色部分的參數(shù)是做什么的,其值又是怎么設(shè)置的?其實它是跟你的開發(fā)板LCD控制器密切相關(guān)的,看了下面兩幅圖相信就大概知道他們是干什么用的:

上面第一幅圖是開發(fā)板原理圖的LCD控制器部分,第二幅圖是S3c2440數(shù)據(jù)手冊中IO端口C和IO端口D控制器部分。原理圖中使用了 GPC8-15和GPD0-15來用做LCD控制器VD0-VD23的數(shù)據(jù)端口,又分別使用GPC0、GPC1端口用做LCD控制器的LEND和VCLK 信號,對于GPC2-7則是用做STN屏或者三星專業(yè)TFT屏的相關(guān)信號。然而,S3C2440的各個IO口并不是單一的功能,都是復(fù)用端口,要使用他們 首先要對他們進行配置。所以上面紅色部分的參數(shù)就是把GPC和GPD的部分端口配置成LCD控制功能模式。

   從以上講述的內(nèi)容來看,要使LCD控制器支持其他的LCD屏,重要的是根據(jù)LCD的數(shù)據(jù)手冊修改以上這些參數(shù)的值。下面,我們再看一下在驅(qū)動中是如果引用 到s3c2410fb_mach_info結(jié)構(gòu)體的(注意上面講的是在內(nèi)核中如何使用的)。在mach-smdk2440.c中有:

//S3C2440初始化函數(shù)
static void __init smdk2440_machine_init(void)
{

    //調(diào)用該函數(shù)將上面定義的LCD硬件信息保存到平臺數(shù)據(jù)中
    s3c24xx_fb_set_platdata(&smdk2440_fb_info);
    
    s3c_i2c0_set_platdata(NULL);

    platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
    smdk_machine_init();
}

s3c24xx_fb_set_platdata定義在plat-s3c24xx/devs.c中:

void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
{
    struct s3c2410fb_mach_info *npd;

    npd = kmalloc(sizeof(*npd), GFP_KERNEL);
    if (npd) {
        memcpy(npd, pd, sizeof(*npd));

        //這里就是將內(nèi)核中定義的s3c2410fb_mach_info結(jié)構(gòu)體數(shù)據(jù)保存到LCD平臺數(shù)據(jù)中,所以在寫驅(qū)動的時候就可以直接在平臺數(shù)據(jù)中獲取s3c2410fb_mach_info結(jié)構(gòu)體的數(shù)據(jù)(即LCD各種參數(shù)信息)進行操作
        s3c_device_lcd.dev.platform_data = npd;
    } else {
        printk(KERN_ERR "no memory for LCD platform data\n");
    }
}

   這里再講一個小知識:不知大家有沒有留意,在平臺設(shè)備驅(qū)動中,platform_data可以保存各自平臺設(shè)備實例的數(shù)據(jù),但這些數(shù)據(jù)的類型都是不同的, 為什么都可以保存?這就要看看platform_data的定義,定義在/linux/device.h中,void *platform_data是一個void類型的指針,在Linux中void可保存任何數(shù)據(jù)類型。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多