以下使用友善之臂的mini2440开发板测试,Fedora9 ,arm-linux-gcc 版本4.3.2,TFT屏的代码是以前买的单片机带的程序,经过更改,在mini2440板上能正常显示。本来想显示BMP图片,暂时没找到程序,所以下面程序只是简单测试字符的显示。
一:驱动程序
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/ioctl.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <asm/io.h>
#include <linux/types.h>
#include <linux/gpio.h>
// TFT屏 ILI9325控制器linux的IO简单字符驱动
// 8位并口数据【j7:j0】,对应9325的位【15:8】,
// J8控制背光,j9-rs, j10-rd,j11-cs,j12-wr,g12-rst。
#define DEVICE_NAME "LCD_ILI9325"
#define ID_AM 011
//定义的一些偏移,作为函数LCD_PIN_H(),
//LCD_PIN_L()的一个实参.
#define CS_offset 11 //ILI9325的CS连接GPJ11
#define RS_offset 9 //ILI9325的RS连接GPJ9
#define WR_offset 12 //ILI9325的WR连接GPJ12
#define RD_offset 10 //ILI9325的RD连接GPJ10
#define BLK_offset 8 //ILI9325的BLK连接GPJ8
#define RST_offset 12 //ILI9325的RST连接GPG12
#define GPJCON 0x560000D0 //J端口配置寄存器物理地址
#define GPJDAT 0x560000D4 //J端口数据寄存器物理地址
//----------------
#define GPGCON 0x56000060 //G端口
#define GPGDAT 0x56000064
//这些虚拟地址作为下面函数在内核中对寄存器的直接操作用,
//内核中不能直接使用寄存器的物理地址
volatile unsigned long *virt_GPJCON ; //J端口配置寄存器虚拟地址
volatile unsigned long *virt_GPJDAT ; //J端口数据寄存器虚拟地址
volatile unsigned long *virt_GPGCON ; //G端口配置寄存器虚拟地址
volatile unsigned long *virt_GPGDAT ; //G端口数据寄存器虚拟地址
const unsigned char english[][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00},/*"#",3*/
{0x00,0x00,0x18,0x18,0x3C,0x66,0x60,0x30,0x18,0x0C,0x06,0x66,0x3C,0x18,0x18,0x00},/*"$",4*/
{0x00,0x00,0x00,0x70,0xD8,0xDA,0x76,0x0C,0x18,0x30,0x6E,0x5B,0x1B,0x0E,0x00,0x00},/*"%",5*/
{0x00,0x00,0x00,0x00,0x38,0x6C,0x6C,0x38,0x60,0x6F,0x66,0x66,0x3B,0x00,0x00,0x00},/*"&",6*/
{0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x00},/*"(",8*/
{0x00,0x00,0x00,0x00,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x00},/*")",9*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x1C,0x7F,0x1C,0x36,0x00,0x00,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x0C,0x18,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x06,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00,0x00},/*"/",15*/
{0x00,0x00,0x00,0x1E,0x33,0x37,0x37,0x33,0x3B,0x3B,0x33,0x1E,0x00,0x00,0x00,0x00},/*"0",16*/
{0x00,0x00,0x00,0x0C,0x1C,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00,0x00,0x00},/*"1",17*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x00,0x00},/*"2",18*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x06,0x1C,0x06,0x66,0x66,0x3C,0x00,0x00,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0x30,0x30,0x36,0x36,0x36,0x66,0x7F,0x06,0x06,0x00,0x00,0x00,0x00},/*"4",20*/
{0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7C,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00},/*"5",21*/
{0x00,0x00,0x00,0x1C,0x18,0x30,0x7C,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00},/*"6",22*/
{0x00,0x00,0x00,0x7E,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x30,0x00,0x00,0x00,0x00},/*"7",23*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x76,0x3C,0x6E,0x66,0x66,0x3C,0x00,0x00,0x00,0x00},/*"8",24*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3E,0x0C,0x18,0x38,0x00,0x00,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x1C,0x1C,0x0C,0x18,0x00,0x00},/*";",27*/
{0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00},/*"<",28*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00},/*">",30*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x0C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00},/*"?",31*/
{0x00,0x00,0x00,0x7E,0xC3,0xC3,0xCF,0xDB,0xDB,0xCF,0xC0,0x7F,0x00,0x00,0x00,0x00},/*"@",32*/
{0x00,0x00,0x00,0x18,0x3C,0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00,0x00,0x00,0x00},/*"A",33*/
{0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00},/*"B",34*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x60,0x60,0x60,0x66,0x66,0x3C,0x00,0x00,0x00,0x00},/*"C",35*/
{0x00,0x00,0x00,0x78,0x6C,0x66,0x66,0x66,0x66,0x66,0x6C,0x78,0x00,0x00,0x00,0x00},/*"D",36*/
{0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7C,0x60,0x60,0x60,0x7E,0x00,0x00,0x00,0x00},/*"E",37*/
{0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7C,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00},/*"F",38*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x60,0x60,0x6E,0x66,0x66,0x3E,0x00,0x00,0x00,0x00},/*"G",39*/
{0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00},/*"H",40*/
{0x00,0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00},/*"I",41*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x60,0x60,0x6E,0x66,0x66,0x3E,0x00,0x00,0x00,0x00},/*"G",42*/
{0x00,0x00,0x00,0x66,0x66,0x6C,0x6C,0x78,0x6C,0x6C,0x66,0x66,0x00,0x00,0x00,0x00},/*"K",43*/
{0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00,0x00,0x00},/*"L",44*/
{0x00,0x00,0x00,0x63,0x63,0x77,0x6B,0x6B,0x6B,0x63,0x63,0x63,0x00,0x00,0x00,0x00},/*"M",45*/
{0x00,0x00,0x00,0x63,0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x63,0x00,0x00,0x00,0x00},/*"N",46*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00},/*"O",47*/
{0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00},/*"P",48*/
{0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x0C,0x06,0x00,0x00},/*"Q",49*/
{0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0x00,0x00,0x00,0x00},/*"R",50*/
{0x00,0x00,0x00,0x3C,0x66,0x60,0x30,0x18,0x0C,0x06,0x66,0x3C,0x00,0x00,0x00,0x00},/*"S",51*/
{0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00},/*"T",52*/
{0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00},/*"U",53*/
{0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00},/*"V",54*/
{0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x6B,0x6B,0x36,0x36,0x36,0x00,0x00,0x00,0x00},/*"W",55*/
{0x00,0x00,0x00,0x66,0x66,0x34,0x18,0x18,0x2C,0x66,0x66,0x66,0x00,0x00,0x00,0x00},/*"X",56*/
{0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x00,0x7E,0x06,0x06,0x0C,0x18,0x30,0x60,0x60,0x7E,0x00,0x00,0x00,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00},/*"[",59*/
{0x00,0x00,0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0C,0x0C,0x06,0x06,0x00,0x00,0x00},/*"\",60*/
{0x00,0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00},/*"]",61*/
{0x00,0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00},/*"_",63*/
{0x00,0x38,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x06,0x3E,0x66,0x66,0x3E,0x00,0x00,0x00,0x00},/*"a",65*/
{0x00,0x00,0x00,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x60,0x60,0x66,0x3C,0x00,0x00,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x7E,0x60,0x60,0x3C,0x00,0x00,0x00,0x00},/*"e",69*/
{0x00,0x00,0x00,0x1E,0x30,0x30,0x30,0x7E,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x7C,0x00},/*"g",71*/
{0x00,0x00,0x00,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00},/*"h",72*/
{0x00,0x00,0x18,0x18,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00},/*"i",73*/
{0x00,0x00,0x0C,0x0C,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x78,0x00},/*"j",74*/
{0x00,0x00,0x00,0x60,0x60,0x66,0x66,0x6C,0x78,0x6C,0x66,0x66,0x00,0x00,0x00,0x00},/*"k",75*/
{0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x7E,0x6B,0x6B,0x6B,0x6B,0x6B,0x63,0x00,0x00,0x00,0x00},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00},/*"n",78*/
{0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x00},/*"p",80*/
{0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x06,0x00},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x66,0x6E,0x70,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x3E,0x60,0x60,0x3C,0x06,0x06,0x7C,0x00,0x00,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x30,0x30,0x7E,0x30,0x30,0x30,0x30,0x30,0x1E,0x00,0x00,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00,0x00,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00},/*"v",86*/
{0x00,0x00,0x00,0x00,0x00,0x63,0x6B,0x6B,0x6B,0x6B,0x36,0x36,0x00,0x00,0x00,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,0x00,0x00,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x0C,0x18,0xF0,0x00},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x00,0x00},/*"z",90*/
{0x00,0x00,0x00,0x0C,0x18,0x18,0x18,0x30,0x60,0x30,0x18,0x18,0x18,0x0C,0x00,0x00},/*"{",91*/
{0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00},/*"|",92*/
{0x00,0x00,0x00,0x30,0x18,0x18,0x18,0x0C,0x06,0x0C,0x18,0x18,0x18,0x30,0x00,0x00},/*"}",93*/
{0x00,0x00,0x00,0x71,0xDB,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} /*"~",94*/
};
//配置端口:端口映射及端口输入输出
static void LCD_PORT_INI(void)
{
unsigned long addr;
unsigned long reg;
addr=(unsigned long)ioremap(GPJCON,4); //配置J端口输出,这里物理地址映射成虚拟地址
virt_GPJCON=(unsigned long *)addr;
reg =ioread32(virt_GPJCON); //内核中对虚拟地址读,即读GPJCON寄存器
reg &=( ~((3<<0)|(3<<2)|(3<<4)|(3<<6)|(3<<8)|(3<<10)|(3<<12)|(3<<14) //对要配置的位先置0
|(3<<16)|(3<<18)|(3<<20)|(3<<22)|(3<<24)) );
reg |= ( (1<<0)|(1<<2)|(1<<4)|(1<<6)|(1<<8)|(1<<10)|(1<<12)|(1<<14) //要配置的位置01,输出
|(1<<16)|(1<<18)|(1<<20)|(1<<22)|(1<<24));
iowrite32(reg,virt_GPJCON); //写到GPJCON寄存器正式配置为输出
addr=(unsigned long)ioremap(GPJDAT,4); //映射J端口数据
virt_GPJDAT=(unsigned long *)addr;
addr=(unsigned long)ioremap(GPGCON,4); //配置G12输出
virt_GPGCON=(unsigned long *)addr;
reg =ioread32(virt_GPGCON);
reg &=( ~(3<<24) );
reg |= ( 1<<24);
iowrite32(reg,virt_GPGCON);
addr=(unsigned long)ioremap(GPGDAT,4); //映射G端口数据
virt_GPGDAT=(unsigned long *)addr;
}
//设置某个管脚高
static void LCD_PIN_H(unsigned char pin_offset,unsigned long *virt_DAT_addr)
{
unsigned long reg;
reg =ioread32(virt_DAT_addr);
reg |=(1<<pin_offset);
iowrite32(reg,virt_DAT_addr);
}
//设置某个管脚低
static void LCD_PIN_L(unsigned char pin_offset,unsigned long *virt_DAT_addr)
{
unsigned long reg;
reg =ioread32(virt_DAT_addr);
reg &=(~(1<<pin_offset));
iowrite32(reg,virt_DAT_addr);
}
static void LCD_WR_DATA16(unsigned short data)//写积存器数据
{
unsigned long reg;
//LCD_RD_H();
LCD_PIN_H(RD_offset,(unsigned long *)virt_GPJDAT);
//LCD_RS_H();
LCD_PIN_H(RS_offset,(unsigned long *)virt_GPJDAT);
//LCD_CS_L();
LCD_PIN_L(CS_offset,(unsigned long *)virt_GPJDAT);
//LCD_WR_L();
LCD_PIN_L(WR_offset,(unsigned long *)virt_GPJDAT);
//数据输出到TFT
reg =ioread32(virt_GPJDAT);
reg &=(~(0xff<<0));
reg |=(data>>8) ;
iowrite32(reg,virt_GPJDAT);
//LCD_WR_H();
LCD_PIN_H(WR_offset,(unsigned long *)virt_GPJDAT);
//LCD_WR_L();
LCD_PIN_L(WR_offset,(unsigned long *)virt_GPJDAT);
//DATA_LCD_PORT=data&0XFF;
//数据输出到TFT
reg =ioread32(virt_GPJDAT);
reg &=(~(0xff<<0));
reg |=(data&0XFF) ;
iowrite32(reg,virt_GPJDAT);
//LCD_WR_H();
LCD_PIN_H(WR_offset,(unsigned long *)virt_GPJDAT);
//LCD_CS_H();
LCD_PIN_H(CS_offset,(unsigned long *)virt_GPJDAT);
}
static void LCD_WR_REG16(unsigned short index)//写积存器命令
{
unsigned long reg;
//LCD_RD_H();
LCD_PIN_H(RD_offset,(unsigned long *)virt_GPJDAT);
//LCD_RS_L();
LCD_PIN_L(RS_offset,(unsigned long *)virt_GPJDAT);
//LCD_CS_L();
LCD_PIN_L(CS_offset,(unsigned long *)virt_GPJDAT);
//LCD_WR_L();
LCD_PIN_L(WR_offset,(unsigned long *)virt_GPJDAT);
//DATA_LCD_PORT=index>>8;
//数据输出到TFT
reg =ioread32(virt_GPJDAT);
reg &=(~(0xff<<0));
reg |=(index>>8) ;
iowrite32(reg,virt_GPJDAT);
//LCD_WR_H();
LCD_PIN_H(WR_offset,(unsigned long *)virt_GPJDAT);
//LCD_WR_L();
LCD_PIN_L(WR_offset,(unsigned long *)virt_GPJDAT);
//DATA_LCD_PORT=index&0XFF;
//数据输出到TFT
reg =ioread32(virt_GPJDAT);
reg &=(~(0xff<<0));
reg |=(index&0XFF) ;
iowrite32(reg,virt_GPJDAT);
//LCD_WR_H();
LCD_PIN_H(WR_offset,(unsigned long *)virt_GPJDAT);
//LCD_CS_H();
LCD_PIN_H(CS_offset,(unsigned long *)virt_GPJDAT);
}
static void LCD_WR_REG(unsigned short index,unsigned short data)
{
LCD_WR_REG16(index);
LCD_WR_DATA16(data);
}
/**********************************************
函数名:Lcd全屏擦除函数
功能:将Lcd整屏擦为指定颜色
入口参数:color 指定Lcd全屏颜色 RGB(5-6-5)
返回值:无
***********************************************/
static void LCD_Clear(unsigned short Color)
{
unsigned long index = 0;
LCD_WR_REG(0x0020,0x0000);//GRAM水平起始位置
LCD_WR_REG(0x0021,0x013F);
LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
LCD_WR_REG(0x0051,239);//水平GRAM终止位置
LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
LCD_WR_REG(0x0053,319);//垂直GRAM终止位置
LCD_WR_REG16(0x0022);
for(index = 0; index < 76800; index++)
{
LCD_WR_DATA16(Color);
}
}
static void LCD_Init(void)
{
LCD_PORT_INI();
LCD_PIN_L(RST_offset,(unsigned long *)virt_GPGDAT);//硬件复位
// udelay(1000000);
mdelay(1000);
LCD_PIN_H(RST_offset,(unsigned long *)virt_GPGDAT);
// udelay(200000);
mdelay(200);
LCD_WR_REG(0x01, 0x0000); // set SS and SM bit
LCD_WR_REG(0x02, 0x0700); // set 1 line inversion
#if ID_AM==000
LCD_WR_REG(0x0003,0x1000);//屏幕旋转控制 TFM=0,TRI=0,SWAP=1,16 bits system interface swap RGB to BRG,此处ORG和HWM 为0
#elif ID_AM==001
LCD_WR_REG(0x0003,0x1008);
#elif ID_AM==010
LCD_WR_REG(0x0003,0x1010);
#elif ID_AM==011
LCD_WR_REG(0x0003,0x1018);
#elif ID_AM==100
LCD_WR_REG(0x0003,0x1020);
#elif ID_AM==101
LCD_WR_REG(0x0003,0x1028);
#elif ID_AM==110
LCD_WR_REG(0x0003,0x1030);
#elif ID_AM==111
LCD_WR_REG(0x0003,0x1038);
#endif
LCD_WR_REG(0x04, 0x0000); // Resize register
LCD_WR_REG(0x08, 0x0207); // set the back porch and front porch
LCD_WR_REG(0x09, 0x0000); // set non-display area refresh cycle ISC[3:0]
LCD_WR_REG(0x0A, 0x0000); // FMARK function
LCD_WR_REG(0x0C, 0x0000); // RGB interface setting
LCD_WR_REG(0x0D, 0x0000); // Frame marker Position
LCD_WR_REG(0x0F, 0x0000); // RGB interface polarity
//*************Power On sequence ****************//
LCD_WR_REG(0x10, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB
LCD_WR_REG(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0]
LCD_WR_REG(0x12, 0x0000); // VREG1OUT voltage
LCD_WR_REG(0x13, 0x1300); // VDV[4:0] for VCOM amplitude
///delay_ms(1000); // Dis-charge capacitor power voltage
// udelay(1000000);
mdelay(1000);
LCD_WR_REG(0x10, 0x1290); // SAP, BT[3:0], AP, DSTB, SLP, STB
LCD_WR_REG(0x11, 0x0527); // DC1[2:0], DC0[2:0], VC[2:0]
//delay_ms(100); // Delay 50ms
// udelay(100000);
mdelay(100);
LCD_WR_REG(0x12, 0x0018); // Internal reference voltage= Vci;
//delay_ms(100); // Delay 50ms
// udelay(100000);
mdelay(100);
LCD_WR_REG(0x13, 0x1000); // Set VDV[4:0] for VCOM amplitude
LCD_WR_REG(0x29, 0x001E); // Set VCM[5:0] for VCOMH
LCD_WR_REG(0x2B, 0x000D); // Set Frame Rate
//delay_ms(100); // Delay 50ms
// udelay(100000);
mdelay(100);
#if ID_AM==000
LCD_WR_REG(0x0020,0x00ef);//GRAM水平起始位置
LCD_WR_REG(0x0021,0x013f);
#elif ID_AM==001
LCD_WR_REG(0x0020,0x00ef);
LCD_WR_REG(0x0021,0x013f);
#elif ID_AM==010
LCD_WR_REG(0x0020,0x0000);
LCD_WR_REG(0x0021,0x013f);
#elif ID_AM==011
LCD_WR_REG(0x0020,0x0000);
LCD_WR_REG(0x0021,0x013f);
#elif ID_AM==100
LCD_WR_REG(0x0020,0x00ef);
LCD_WR_REG(0x0021,0x0000);
#elif ID_AM==101
LCD_WR_REG(0x0020,0x00ef);
LCD_WR_REG(0x0021,0x0000);
#elif ID_AM==110
LCD_WR_REG(0x0020,0x0000);
#elif ID_AM==111
LCD_WR_REG(0x0020,0x0000);
LCD_WR_REG(0x0021,0x0000);
#endif
// ----------- Adjust the Gamma Curve ----------//
LCD_WR_REG(0x30, 0x0004);
LCD_WR_REG(0x31, 0x0007);
LCD_WR_REG(0x32, 0x0006);
LCD_WR_REG(0x35, 0x0206);
LCD_WR_REG(0x36, 0x0408);
LCD_WR_REG(0x37, 0x0507);
LCD_WR_REG(0x38, 0x0200);
LCD_WR_REG(0x39, 0x0707);
LCD_WR_REG(0x3C, 0x0504);
LCD_WR_REG(0x3D, 0x0F02);
//------------------ Set GRAM area ---------------//
LCD_WR_REG(0x50, 0x0000); // Horizontal GRAM Start Address
LCD_WR_REG(0x51, 0x00EF); // Horizontal GRAM End Address
LCD_WR_REG(0x52, 0x0000); // Vertical GRAM Start Address
LCD_WR_REG(0x53, 0x013F); // Vertical GRAM Start Address
LCD_WR_REG(0x60, 0x2700); // Gate Scan Line A700
LCD_WR_REG(0x61, 0x0001); // NDL,VLE, REV
LCD_WR_REG(0x6A, 0x0000); // set scrolling line
//-------------- Partial Display Control ---------//
LCD_WR_REG(0x80, 0x0000);
LCD_WR_REG(0x81, 0x0000);
LCD_WR_REG(0x82, 0x0000);
LCD_WR_REG(0x83, 0x0000);
LCD_WR_REG(0x84, 0x0000);
LCD_WR_REG(0x85, 0x0000);
//-------------- Panel Control -------------------//
LCD_WR_REG(0x90, 0x0010);
LCD_WR_REG(0x92, 0x0600);
LCD_WR_REG(0x93, 0x0003);
LCD_WR_REG(0x95, 0x0110);
LCD_WR_REG(0x97, 0x0000);
LCD_WR_REG(0x98, 0x0000);
LCD_WR_REG(0x07, 0x0173); // 262K color and display ON 0133
LCD_Clear(0X0);
//delay_ms(500); // Delay 5ms
//LCD_BL_H();
LCD_PIN_H(BLK_offset,(unsigned long *)virt_GPJDAT);
}
static void LCD_write_english(unsigned char data,unsigned short color,unsigned short xcolor)//写字符
{
unsigned char avl,i,n;
LCD_WR_REG16(0x0022);
for (i=0;i<16;i++)
{
//avl=pgm_read_byte( &english[data-32][i]);
avl=english[data-32][i];
for (n=0;n<8;n++)
{
if(avl&0x80) LCD_WR_DATA16(color);
else LCD_WR_DATA16(xcolor);
avl<<=1;
}
}
}
/*************************************************
函数名:Lcd光标起点定位函数
功能:指定320240液晶上的一点作为写数据的起始点
入口参数:x 坐标 0~239
y 坐标 0~319
返回值:无
*************************************************/
static void LCD_SetCursor(unsigned char Xpos, unsigned char Ypos)
{
// CLR_RS;
LCD_WR_REG(0x20, Xpos);
LCD_WR_REG(0x21, Ypos);
}
/**********************************************
函数名:Lcd块选函数
功能:选定Lcd上指定的矩形区域
注意:xStart和 yStart随着屏幕的旋转而改变,位置是矩形框的四个角
入口参数:xStart x方向的起始点
ySrart y方向的终止点
xLong 要选定矩形的x方向长度
yLong 要选定矩形的y方向长度
返回值:无
***********************************************/
static void Lcd_SetBox(unsigned char xStart,unsigned short yStart,unsigned char xLong,unsigned short yLong)
{
#if ID_AM==000
LCD_SetCursor(xStart+xLong-1,312-yStart+yLong-1);
#elif ID_AM==001
LCD_SetCursor(xStart+xLong-1,312-yStart+yLong-1);
#elif ID_AM==010
LCD_SetCursor(xStart,312-yStart+yLong-1);
#elif ID_AM==011
LCD_SetCursor(xStart,312-yStart+yLong-1);
#elif ID_AM==100
LCD_SetCursor(xStart+xLong-1,312-yStart);
#elif ID_AM==101
LCD_SetCursor(xStart+xLong-1,312-yStart);
#elif ID_AM==110
LCD_SetCursor(xStart,312-yStart);
#elif ID_AM==111
LCD_SetCursor(xStart,312-yStart);
#endif
LCD_WR_REG(0x0050,xStart);//水平 GRAM起始位置
LCD_WR_REG(0x0051,xStart+xLong-1);//水平GRAM终止位置
LCD_WR_REG(0x0052,312-yStart);//垂直GRAM起始位置
LCD_WR_REG(0x0053,312-yStart+yLong-1);//垂直GRAM终止位置
}
static void LCD_write_english_string(unsigned short x,unsigned char y,unsigned char *s,unsigned short color,unsigned short xcolor)//英文字符串显示
{
unsigned int k=0;
while (*s)
{
Lcd_SetBox(y,x+k,15,8);
LCD_write_english( *s,color,xcolor);
k=k+8;
s++;
}
}
static int ili9325_open(struct inode *inode, struct file *file)
{
printk("ILI9325_driver_start\n");
LCD_Init();
printk("ILI9325_driver_open_wan_cheng\n");
LCD_write_english_string(20,60,"Open the device successfully",0x07E0,0x0000);
printk("ILI9325_driver_display_test_wan_cheng\n");
return 0;
}
static ssize_t ili9325_my001_write(struct file *filp, const char __user *buff, size_t count, loff_t *offp)
{
int size=count;
unsigned char ddat[size+1];
printk("ILI9325_driver_write_start\n");
LCD_write_english_string(20,100,"write_test",0xFFFF,0x0000);
///return 1 ;
if (copy_from_user(ddat, buff, size))//
{
printk("write_data_error\n");
return -1;
}
ddat[size]='\0';
printk("ILI9325_write_start\n");
LCD_write_english_string(20,100,ddat,0xFFFF,0x0000);
printk("ILI9325_write_wan_cheng\n");
return size;
}
static struct file_operations ili9325_fops = {
.owner = THIS_MODULE,
.write = ili9325_my001_write,
.open = ili9325_open,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &ili9325_fops ,
};
static int __init dev_init(void)
{
int ret;
printk("dev_driver_start_init\n");
ret = misc_register(&misc);
printk("dev_driver_init_wan_cheng\n");
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("cole3");
二:测试程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <error.h>
#include <time.h>
#include <fcntl.h>
static int fd=0;
static int count_0=0;
static char a=0;
//ili9325 测试程序
//CPU初始化//
int main(void)
{
unsigned char display[]="liang hou xian 2012-06-09";
fd = open("/dev/LCD_ILI9325", O_RDWR);
if (fd < 0) {
printf("ILI9325_open_error\n");
exit(1);
}
printf("ILI9325_open_cheng_gong\n");
count_0=write(fd, display, sizeof(display)); //ILI9325屏显示 "liang hou xian 2012-06-09"。
printf("count_0=%d\n",count_0);
perror("write") ;
sleep(1);
close(fd);
return 0;
}