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驱动程序?

分配一个fb_info结构体: framebuffer_alloc

设置

注册: register_framebuffer

硬件相关的操作

测试:

make menuconfig去掉原来的驱动程序 -> Device Drivers -> Graphics support S3C2410 LCD framebuffer support

make uImage make modules

cp arch/arm/boot/uImage /work/nfs_root/uImage_nolcd

使用新的uImage启动开发板: nfs 30000000 192.168.31.202:/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 // 花屏

修改vi /etc/inittab tty1::askfirst:-/bin/sh 用新内核重启开发板 nfs 30000000 192.168.31.202:/work/nfs_root/uImage_nolcd bootm 30000000

mount -t nfs -o nolock,vers=2 192.168.31.202:/work/nfs_root/first_fs /mnt cd /mnt/

insmod cfbcopyarea.ko insmod cfbfillrect.ko insmod cfbimgblt.ko insmod lcd.ko insmod buttons.ko

在开发板上按ls 回车,液晶屏则列出所在目录的文件

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐