第18章LCD设备驱动之Linux 帧缓冲设备驱动的fb_ops成员函数

18.7 Linux 帧缓冲设备驱动的fb_ops成员函数

    fb_info 中的 fp_ops 是使得帧缓冲设备工作所需函数的集合,它们最终与 LCD 控制器硬件打交道。

    fb_check_var()用于调整可变参数,并修正为硬件所支持的值;fb_set_par()根据屏幕参数设置具体读写 LCD 控制器的寄存器以使得 LCD 控制器进入相应的工作状态。对于 fb_ops 中的 fb_fillrect()、fb_copyarea()和 fb_imageblit()成员函数,通常直接使用对应的通 用 的 cfb_fillrect() 、 cfb_copyarea() 和 cfb_imageblit() 函 数 即 可 。

     cfb_fillrect() 函 数 定 义 在drivers/video/fbdev/core/cfbfillrect.c文件中

void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect)
{
        unsigned long pat, pat2, fg;
        unsigned long width = rect->width, height = rect->height;
        int bits = BITS_PER_LONG, bytes = bits >> 3;
        u32 bpp = p->var.bits_per_pixel;
        unsigned long __iomem *dst;
        int dst_idx, left;

        if (p->state != FBINFO_STATE_RUNNING)
                return;

        if (p->fix.visual == FB_VISUAL_TRUECOLOR ||
            p->fix.visual == FB_VISUAL_DIRECTCOLOR )
                fg = ((u32 *) (p->pseudo_palette))[rect->color];
        else
                fg = rect->color;

        pat = pixel_to_pat(bpp, fg);

        dst = (unsigned long __iomem *)((unsigned long)p->screen_base & ~(bytes-1));
        dst_idx = ((unsigned long)p->screen_base & (bytes - 1))*8;
        dst_idx += rect->dy*p->fix.line_length*8+rect->dx*bpp;
        /* FIXME For now we support 1-32 bpp only */
        left = bits % bpp;
        if (p->fbops->fb_sync)
                p->fbops->fb_sync(p);
        if (!left) {
                u32 bswapmask = fb_compute_bswapmask(p);
                void (*fill_op32)(struct fb_info *p,
                                  unsigned long __iomem *dst, int dst_idx,
                                  unsigned long pat, unsigned n, int bits,
                                  u32 bswapmask) = NULL;

                switch (rect->rop) {
                case ROP_XOR:
                        fill_op32 = bitfill_aligned_rev;
                        break;
                case ROP_COPY:
                        fill_op32 = bitfill_aligned;
                        break;
                default:
                        printk( KERN_ERR "cfb_fillrect(): unknown rop, defaulting to ROP_COPY\n");
                    &nb

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值