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;}
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)