主题 : linux下ILI9325屏的驱动及测试程序 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 41302
精华: 0
发帖: 11
金钱: 60 两
威望: 12 点
综合积分: 22 分
注册时间: 2011-03-28
最后登录: 2014-04-03
楼主  发表于: 2012-06-19 13:35

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

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]);
      avl=english[data-32];
      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;
  
}



附件: ILI9325_app.rar (1 K) 下载次数:3
附件: linux_driver_ILI9325.rar (6 K) 下载次数:3