[转载]AT91SAM9260 SMC外接LCD的驱动 - 经天纬地之奇_Detective_ALong_新浪博客

LCD数据线对应连接到9260数据总线
WR与OE连接到9260WR与RD线
CMD连接到地址线A2

CS是连接到NCS7

首先初始化NCS7所在SMC

void sam9_smc_configure(int cs, struct sam9_smc_config* config){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));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));at91_sys_write(AT91_SMC_CYCLE(cs),AT91_SMC_NWECYCLE_(config->write_cycle) AT91_SMC_NRDCYCLE_(config->read_cycle));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 .ncs_read_pulse = 6,//45, //256.ncs_write_setup = 2,淘宝刷信誉,//15,.ncs_write_pulse = 6,//45,刷信誉,.nwe_setup = 4,//30, .nwe_pulse = 2,//15, .write_cycle = 10,//75, .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!rn");ret = -1;goto exit0;}virt_addr = ioremap(LCD_BASE_ADDR,512);if(!virt_addr){printf("ioremap failrn");ret = -1;goto exit1;}// printf("virt addr:%8xrn",(unsigned int)virt_addr);filp->private_data = virt_addr;lcd_cdev->virt_addr = virt_addr;if(atomic_dec_and_test(&lcd_ato))lcd_init();elseatomic_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,http://www.shuazuanle.com/,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)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值