目录
本章开始,主要检查第一章中编写的驱动代码,并记录检查的流程,讲从4412寄存器的中开始,不放过一点一滴的细节。
设备树源码
/* LCD设备 */
lcd_4_3@11C00000 {
compatible = "itop4412, lcd_4_3";
reg = <0x11C00000 0x20c0 0x10010210 0x08 0x10023c80 0x04 0x1003c000 0x1000>;
pinctrl-names = "default";
pinctrl-0 = <&lcd_4_3>;
clocks = <&clock CLK_FIMD0 &clock CLK_ACLK160>;
clock-names = "fimd0","aclk160";
};
设备树源码对应寄存器
从设备树的LCD节点中,可以知道,4412的LCD设备主要使用了四个寄存器。这四个寄存器分别是:
系统控制寄存器、供电管理寄存器、时钟管理寄存器、FIMD外设寄存器,在手册的Memory Map章节中可以找到,在P84页。
系统控制寄存器----LCD内容:
主要配置接口、FIMD外设时钟是否供给。下图在手册P876页。
供电管理控制寄存器----LCD内容:
主要负责使能LCD电源输出。下图在P729页
时钟管理寄存器----LCD内容:
时钟管理寄存器主要配置几个方面:SRC寄存器时钟源选择、SRC_MASK寄存器决定时钟给不给外设、DIV时钟分频、GATE寄存器。
SRC寄存器时钟源选择,P501。
SRC_MASK寄存器,P514。
DIV时钟分频,P526。
GATE寄存器,P552。
FIMD外设寄存器
过长就不展开
驱动源码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/fb.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/wait.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/div64.h>
#include <asm/mach/map.h>
#include <linux/fb.h>
#include <asm/types.h>
#define VIDCON0 0x00//视频寄存器0
#define VIDCON1 0x04//视频寄存器1
#define VIDCON2 0x08//视频寄存器2
#define VIDCON3 0x0c//视频寄存器3
#define VIDTCON0 0x10//LCD时序控制寄存器0
#define VIDTCON1 0x14//LCD时序控制寄存器1
#define VIDTCON2 0x18//LCD时序控制寄存器2
#define VIDTCON3 0x1c//LCD时序控制寄存器3
#define WINCON0 0x20//窗口控制寄存器0
#define SHADOWCON 0x34//阴影控制寄存器
#define WINCHMAP2 0x3c//窗口和通道映射寄存器
#define VIDOSD0A 0x40//窗口0位置控制寄存器
#define VIDOSD0B 0x44//窗口0位置控制寄存器
#define VIDOSD0C 0x48//窗口0大小控制寄存器
#define VIDW00ADD0B0 0xA0//指定窗口起始地址寄存器
#define VIDW00ADD1B0 0xD0//指定窗口借宿地址寄存器
#define CLK_SRC_LCD0 0x234//时钟源配置寄存器偏移
#define CLK_SRC_MASK_LCD 0x334//时钟复用器输出掩码,掩着就不输出
#define CLK_DIV_LCD 0x534//FIMD时钟分频
#define CLK_GATE_IP_LCD 0x934//时钟输出掩码
#define LCDBLK_CFG 0x00//系统控制LCD寄存器偏移,配置RGB接口或80接口等
#define LCDBLK_CFG2 0x04//PWM配置
#define LCD_LENTH 480
#define LCD_WIDTH 272
#define BITS_PER_PIXEL 16
static int s3c_lcdfb_setcolreg(unsigned int regno, unsigned int red,
unsigned int green, unsigned int blue,
unsigned int transp, struct fb_info *info);
static struct fb_ops s3c_lcdfb_ops =
{
.owner = THIS_MODULE,
.fb_setcolreg = s3c_lcdfb_setcolreg,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
};
static struct fb_info