linux下ILI9325屏的驱动及测试程序

以下使用友善之臂的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;
 
}

 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值