LCD数据线对应连接到9260数据总线
WR与OE连接到9260WR与RD线
CMD连接到地址线A2
CS WR RD的数据建立,保持,脉冲时间都可设置,具体可看寄存器设置。
同时LCD只初始化一次,release函数完成MEM的释放
我的LCD为160*160集中器上使用的,驱动IC为uc1698。
写数据和命令宏定义如下:
WR与OE连接到9260WR与RD线
CMD连接到地址线A2
CS是连接到NCS7
首先初始化NCS7所在SMC
/*------------------------------------------------
function : init at91sam9260 smc in ncs7
in :
cs : ncsx
config : struct sam9_smc_config
------------------------------------------------*/
void sam9_smc_configure(int cs, struct sam9_smc_config* config)
{
/* Setup register */
at91_sys_write(AT91_SMC_SETUP(cs), AT91_SMC_NWESETUP_(config->nwe_setup) | AT91_SMC_NCS_WRSETUP_(config->ncs_write_setup)| AT91_SMC_NRDSETUP_(config->nrd_setup)| AT91_SMC_NCS_RDSETUP_(config->ncs_read_setup));
/* Pulse register */
at91_sys_write(AT91_SMC_PULSE(cs),AT91_SMC_NWEPULSE_(config->nwe_pulse)| AT91_SMC_NCS_WRPULSE_(config->ncs_write_pulse)| AT91_SMC_NRDPULSE_(config->nrd_pulse)| AT91_SMC_NCS_RDPULSE_(config->ncs_read_pulse));
/* Cycle register */
at91_sys_write(AT91_SMC_CYCLE(cs),AT91_SMC_NWECYCLE_(config->write_cycle)| AT91_SMC_NRDCYCLE_(config->read_cycle));
/* Mode register */
at91_sys_write(AT91_SMC_MODE(cs),config->mode| AT91_SMC_TDF_(config->tdf_cycles));
}
/*--------------------------------------------------
--------------------------------------------------*/
int sam9_smc_init(void)
{
int ret = 0;
struct sam9_smc_config smc_config ={
.ncs_read_setup = 2,//15, //128 /*->128 (bit5*128+bit4:0)*/
.ncs_read_pulse = 6,//45, //256/*->256 (bit6*256+bit5:0)*/
.ncs_write_setup = 2,//15,
.ncs_write_pulse = 6,//45,
.nwe_setup = 4,//30, /*->128+31*/
.nwe_pulse = 2,//15, /*->63*/
.write_cycle = 10,//75, /*->512 (bit8:7*256+bit6:0)*/
.nrd_setup = 4,//30,
.nrd_pulse = 2,//15,
.read_cycle = 10,//75,
.mode = AT91_SMC_DBW_8+AT91_SMC_EXNWMODE_DISABLE+
AT91_SMC_READMODE+AT91_SMC_WRITEMODE+AT91_SMC_BAT_SELECT,
};
printf("lcd io init!\n");
sam9_smc_configure(7,&smc_config);
at91_set_B_periph(AT91_PIN_PC12, 1);
return ret;
}
CS WR RD的数据建立,保持,脉冲时间都可设置,具体可看寄存器设置。
之后申请该SMC的MEM,NCS7对应物理地址是0x80000000,在open时申请
int lcd_open(struct inode *inode,struct file *filp)
{
int ret=0;
unsigned int *virt_addr;
if(!request_mem_region(LCD_BASE_ADDR,512,"lcd")){
printf("request mem region fail!\r\n");
ret = -1;
goto exit0;
}
virt_addr = ioremap(LCD_BASE_ADDR,512);
if(!virt_addr){
printf("ioremap fail\r\n");
ret = -1;
goto exit1;
}
// printf("virt addr:%8x\r\n",(unsigned int)virt_addr);
filp->private_data = virt_addr;
lcd_cdev->virt_addr = virt_addr;
if(atomic_dec_and_test(&lcd_ato))
lcd_init();
else
atomic_add(1,&lcd_ato);
return 0;
exit1:
release_mem_region(LCD_BASE_ADDR,512);
exit0:
return ret;
}
int lcd_release(struct inode *inode,struct file *filp)
{
iounmap(filp->private_data);
release_mem_region(LCD_BASE_ADDR,512);
return 0;
}
我的LCD为160*160集中器上使用的,驱动IC为uc1698。
写数据和命令宏定义如下:
#define lcd_cmd(x) do{iowrite8(x,lcd_cdev->virt_addr);wmb();}while(0)
#define lcd_data(x) do{iowrite8(x,lcd_cdev->virt_addr+0xf);wmb();}while(0)
其他就是按照LCD的手册完成初始化及写等功能。