5.lcd驱动流程

github驱动代码:https://github.com/China-wzs/Linux-driver/blob/master/4.lcd.rar

5.lcd驱动流程

 

5.lcd驱动流程

LCD驱动程假设

app:  open("/dev/fb0", ...)   主设备号: 29, 次设备号: 0

--------------------------------------------------------------

kernel:

         fb_open

              int fbidx = iminor(inode);

              struct fb_info *info = = registered_fb[0];

 

app:  read()

---------------------------------------------------------------

kernel:

          fb_read

               int fbidx = iminor(inode);

               struct fb_info *info = registered_fb[fbidx];

               if (info->fbops->fb_read)

                    return info->fbops->fb_read(info, buf, count, ppos);

             

               src = (u32 __iomem *) (info->screen_base + p);

               dst = buffer;

               *dst++ = fb_readl(src++);

               copy_to_user(buf, buffer, c)             

 

问1. registered_fb在哪里被设置?

答1. register_framebuffer

 

怎么写LCD驱动程序?

5.lcd驱动流程

1. 分配一个fb_info结构体(用来设置硬件相关操作): framebuffer_alloc

2. 设置

3. 注册: register_framebuffer(向上注册)

4. 硬件相关的操作

5.lcd驱动流程

 

测试:

1. make menuconfig去掉原来的驱动程序

-> Device Drivers

  -> Graphics support

<M> S3C2410 LCD framebuffer support

 

2. make uImage

   make modules 

 

3. 使用新的uImage启动开发板:

4.

nfs 30000000 192.168.2.126:/work/nfs_root/uImage_nolcd

 

bootm 30000000

insmod cfbcopyarea.ko

insmod cfbfillrect.ko

insmod cfbimgblt.ko

insmod lcd.ko

 

echo hello > /dev/tty1  // 可以在LCD上看见hello

cat lcd.ko > /dev/fb0   // 花屏

 

5. 修改 /etc/inittab

tty1::askfirst:-/bin/sh

用新内核重启开发板

 

insmod cfbcopyarea.ko

insmod cfbfillrect.ko

insmod cfbimgblt.ko

insmod lcd.ko

insmod buttons.ko

RGB格式

RGB565:https://baijiahao.baidu.com/s?id=1589371935820142680&wfr=spider&for=pc

a.概述:

RGB565格式每一个像素用16个bit来表示,2个字节, 1个WORD, R, G, B分别用5, 6, 5个bit来表示,格式也因此而得名。

b.存储示意:

5.lcd驱动流程

RGB565

c.获取具体像素值方法:

根据RGB565的存储方式,即可得到获取R,G,B分量的值。现假设计算机中存储某一个像素点的变量为color, 数据类型为short. 那么则有:

R = color & 0xF800, (获取高字节的5个bit)

G = color & 0x07E0, (获取中间6个bit)

B = color & 0x001F, (获取低字节5个bit)