AT91SAM9260 SMC外接LCD的驱动

LCD数据线对应连接到9260数据总线
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;
}


同时LCD只初始化一次,release函数完成MEM的释放


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的手册完成初始化及写等功能。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值