// ============================================================================= // 功能: I/O模拟的方式 释放没有复位和使能引脚的IIC器件 // 参数: port I/O口 如 CN_GPIO_B // TS_SDA:引脚号 // TS_SCK:引脚号 // 返回: true/false // ============================================================================= static bool_t _IIC_Busfree(u32 port,u32 sda_pin,u32 sck_pin) { u32 timeout=0; GPIO_CfgPinFunc(port,sda_pin,CN_GPIO_MODE_IN_FLOATING);//TS_SDA GPIO_CfgPinFunc(port,sck_pin,CN_GPIO_MODE_GPIO_OUT_OD_50Mhz);//TS_SCK while(1) { timeout++; GPIO_SettoLow(port,1<<sck_pin); Djy_DelayUs(10); GPIO_SettoHigh(port,1<<sck_pin); Djy_DelayUs(10); if(timeout>=CONFIG_I2C_TIMEOUT) return false; if( GPIO_GetData(port)&(1<<sda_pin)) break; } GPIO_CfgPinFunc(port,sda_pin,CN_GPIO_MODE_GPIO_OUT_OD_50Mhz);//TS_SDA //产生停止信号 iic总线释放 GPIO_SettoLow(port,1<<sda_pin); Djy_DelayUs(10); GPIO_SettoHigh(port,1<<sda_pin); Djy_DelayUs(10); return true; }
// ============================================================================= // 功能:DM9000网卡芯片复位 // 参数:无 // 返回:无 // ============================================================================= void DM9000_reset(void) { DM9000_DBG("resetting\n"); dm_reg_write(DM9000_NCR, NCR_RST); Djy_DelayUs(3000); /* delay 3ms */ dm_reg_write(DM9000_NCR, 0x00); dm_reg_write(DM9000_NCR, NCR_RST); Djy_DelayUs(3000); /* delay 3ms */ dm_reg_write(DM9000_NCR, 0x00); }
//----写PHY(半字)-------------------------------------------------------------- //功能:向PHY中写入16位的数据 //参数:reg,寄存器偏移地址 // value,要写入的值 //返回:无 //----------------------------------------------------------------------------- static void phyw_h(u8 reg, u16 value) { iow(DM9000A_EPAR, reg|0x40);// 使用内部PHY时bit[7:6]要为01b iow(DM9000A_EPDRL, value&0xFF); iow(DM9000A_EPDRH, (value&0xFF00)>>8); iow(DM9000A_EPCR, 0x0A); // 选择PHY功能,写功能 while (ior(DM9000A_EPCR) & 0x01) { Djy_DelayUs(10); } Djy_DelayUs(150); iow(DM9000A_EPCR, 0x00); // 由程序清零 }
//----设置PHY工作模式------------------------------------------------------------ //功能:设置PHY工作模式 //参数:无 //返回:无 //----------------------------------------------------------------------------- static void set_phy_mode(void) { u16 phy_reg4 = 0x01e1, phy_reg0 = 0x3100; // reset PHY phyw_h(0, 0x8000); do { Djy_DelayUs(50); } while (phyr_h(0) & 0x8000); switch (media_mode) { case DM9000A_10MHD: phy_reg4 = 0x21; phy_reg0 = 0x0000; break; case DM9000A_10MFD: phy_reg4 = 0x41; phy_reg0 = 0x1100; break; case DM9000A_100MHD: phy_reg4 = 0x81; phy_reg0 = 0x2000; break; case DM9000A_100MFD: phy_reg4 = 0x101; phy_reg0 = 0x3100; break; } phyw_h(4, phy_reg4); // Set PHY media mode phyw_h(0, phy_reg0); // Tmp }
//----DM9000A初始化------------------------------------------------------------- //功能:初始化DM9000A //参数:无 //返回:正常时返回0,错误时返回错误号 //----------------------------------------------------------------------------- u32 dm9000a_init(void) { u16 i; dm9000a_reset(); // 软件复位 if (dm9000a_probe() != 0) // 探查当前操作的芯片是否为DM9000A(读出ID进行对比) return -1; iow(DM9000A_GPR, 0x00); // PHYPD=0时使能PHY,默认为1表示不使能内部PHY Djy_DelayUs(20*mS); iow(DM9000A_NCR, 0x03); // 选择内部PHY Djy_DelayUs(20); iow(DM9000A_NCR, 0x03); // 选择内部PHY(重复一次) Djy_DelayUs(20); ior(DM9000A_NSR); // 清除发送状态(读取即可清除) dm9000a_set_macaddr(MyMAC); // 设置MAC地址 dm9000a_set_multicastaddr(); // 设置多播地址 set_phy_mode(); // 自动协商 while (!(phyr_h(1) & 0x20)) // 自动协商完成标志位 { Djy_EventDelay(5*mS); // 50mS } // 读回IO、Base模式 ehi.io = (ior(DM9000A_ISR)>>6) & 0x3; ehi.base = (phyr_h(17)>>12) & 0xF; semp_dm9000 = Lock_SempCreate(1, 1, NULL); if (semp_dm9000 == NULL) { return -1; } dm9000a_reset_to_new(); // TODO DM9000A具有IP、UDP、TCP的检验和自动计算功能 //... i = ior(DM9000A_NSR); // xxx del 需要等于0x40才表示连接成功 return 0; }
//----读PHY(半字)-------------------------------------------------------------- //功能:从PHY中读取16位的数据 //参数:reg,寄存器偏移地址 //返回:读得的寄存器值 //----------------------------------------------------------------------------- static u16 phyr_h(u8 reg) { u16 tmp; iow(DM9000A_EPAR, reg|0x40); // 使用内部PHY时bit[7:6]要为01b iow(DM9000A_EPCR, 0x0C); // 选择PHY功能,读取功能 while (ior(DM9000A_EPCR) & 0x01) { Djy_DelayUs(10); } Djy_DelayUs(150); iow(DM9000A_EPCR, 0x00); // 由程序清零 tmp = ior(DM9000A_EPDRL); tmp |= ior(DM9000A_EPDRH)<<8; return tmp; }
//----DM9000A复位--------------------------------------------------------------- //功能:软件复位DM9000A。某些寄存器的值不受软件复位的影响。 //参数:无 //返回:无 //----------------------------------------------------------------------------- void dm9000a_reset(void) { iow(DM9000A_NCR, 0x01); // RESET do { Djy_DelayUs(30); // 延时30us,应用手册上说至少20us } while (ior(DM9000A_NCR) & 0x01); iow(DM9000A_NCR, 0x00); }
//向DM9000PHY寄存器写数据 static void dm_reg_write_phy(u16 reg, u16 data) { dm_reg_write(DM9000_EPAR, reg|0x40); dm_reg_write(DM9000_EPDRH, (data>>8)&0xff); dm_reg_write(DM9000_EPDRL, data&0xff); dm_reg_write(DM9000_EPCR, 0x0a); //phy写命令 Djy_DelayUs(20); dm_reg_write(DM9000_EPCR, 0x08); //清除PHY读操作 }
// ============================================================================= // 功能: 配置uart半双工模式为发送或接收 // 参数:SerialNo,串口号 // 返回: 无 // ============================================================================= void __UART_half_duplex_recv(u32 SerialNo) { // if(SerialNo == CN_UART1) // GPIO_SettoLow(&uart1_485_2[0]); // else if(SerialNo == CN_USART0) // GPIO_SettoLow(&usart0_485_1[0]); // else // ; //MAX485芯片返回控制接收和发送时间 Djy_DelayUs(12); }
//读DM9000PHY寄存器 static u16 dm_reg_read_phy(u16 reg) { u16 data; dm_reg_write(DM9000_EPAR, reg|0x40); dm_reg_write(DM9000_EPCR, 0x0c); //phy读命令 data = dm_reg_read(DM9000_EPDRH); //读phy data = (data<<8) | dm_reg_read(DM9000_EPDRL); Djy_DelayUs(20); dm_reg_write(DM9000_EPCR, 0x08); //清除读phy操作 return data; }
// ============================================================================= // 功能:DM9000以太网网卡硬件初始化,包括复位网卡、清发送和接收状态、配置MAC地址、 // 使能接收中断信息输出(若需产生中断,还需配置中断线) // 参数:无 // 返回: // ============================================================================= bool_t DM9000_HardInit(void) { dm_reg_write(DM9000_NCR,1); //软件复位DM9000 Djy_DelayUs(30); //延时至少20μs dm_reg_write(DM9000_NCR,0); //清除复位位 dm_reg_write(DM9000_NCR,1); //为了确保复位正确,再次复位 Djy_DelayUs(30); dm_reg_write(DM9000_NCR,0); if(false == DM9000_PhyInit()) //PHY芯片初始化 return false; dm_reg_write(DM9000_NSR,0x2c); //清TX状态 dm_reg_write(DM9000_ISR,0xf); //清中断状态 dm_reg_write(DM9000_RCR,0x39); //设置RX控制 dm_reg_write(DM9000_TCR,0); //设置TX控制 dm_reg_write(DM9000_BPTR,0x3f); dm_reg_write(DM9000_FCTR,0x3a); dm_reg_write(DM9000_FCR,0xff); dm_reg_write(DM9000_SMCR,0x00); dm_reg_write(DM9000_PAR+0,sgNetHardMac[0]); //设置MAC地址 dm_reg_write(DM9000_PAR+1,sgNetHardMac[1]); dm_reg_write(DM9000_PAR+2,sgNetHardMac[2]); dm_reg_write(DM9000_PAR+3,sgNetHardMac[3]); dm_reg_write(DM9000_PAR+4,sgNetHardMac[4]); dm_reg_write(DM9000_PAR+5,sgNetHardMac[5]); dm_reg_write(DM9000_NSR,0x2c); //再次清TX状态 dm_reg_write(DM9000_ISR,0xf); //再次清中断状态 dm_reg_write(DM9000_IMR,0x81); //打开接受数据中断 while(!(dm_reg_read(DM9000_NSR) & NSR_LINKST)); DM9000_DBG("DM9000 Linked!\r\n"); return true; }
ptu32_t LedAllOff(void) { u8 i; while(1) { for(i = 0; i < 8; i++) { LED_Off(i); Djy_DelayUs(100*mS); } Djy_EventPop(ledontask,NULL,0,NULL,0,200); Djy_WaitEvttPop(Djy_MyEvttId(),NULL,CN_TIMEOUT_FOREVER); } return 0; }
// ============================================================================= // 功能: 打印函数,直接写串口方式,目前主要由djy_printk独享,用于调试关键代码段 // 参数: 所需要发送的字符串,当然,前提是你提供的一定是字符串'\0'结束 // 返回: 发送的字节个数 // ============================================================================= u32 Uart_SendServiceDirectly(char *str) { u32 result=0,len,timeout=100*mS; tagUartReg *Reg; u32 BaseAddr,Port; if(!strcmp(gc_pCfgStddevName,"UART0") && (sUartInited & (0x01 << CN_UART0))) { BaseAddr = CN_UART0_BASE; Port = CN_UART0; } else if(!strcmp(gc_pCfgStddevName,"UART1")&& (sUartInited & (0x01 << CN_UART1))) { BaseAddr = CN_UART1_BASE; Port = CN_UART1; } else if(!strcmp(gc_pCfgStddevName,"USART0")&& (sUartInited & (0x01 << CN_USART0))) { BaseAddr = CN_USART0_BASE; Port = CN_USART0; } else if(!strcmp(gc_pCfgStddevName,"USART1")&& (sUartInited & (0x01 << CN_USART1))) { BaseAddr = CN_USART1_BASE; Port = CN_USART1; } else return 0; len = strlen(str); Reg = (tagUartReg *)BaseAddr; __UART_SendIntDisable(Reg,s_UART_DmaUsed[Port]); //disable send INT for(result=0; result < len; result ++) { // 超时或者发送缓冲为空时退出 while((false == __UART_TxTranEmpty(Reg))&& (timeout > 0)) { timeout--; Djy_DelayUs(1); } if(timeout == 0) break; Reg->UART_THR = str[result]; } __UART_SendIntEnable(Reg,s_UART_DmaUsed[Port]); //enable send INT return result; }
//----读写flash等待操作完成----------------------------------------------------- //功能:利用s29glxxx的toggle功能,如果内部写或擦除操作正在进行,连续两次读(任意 // 地址)将得到0/1交替的结果。 //参数:delay_us,等待操作完成的时间,微秒 //全局:chip_addr,芯片基地址 //返回:true=完成查询,false=超时不结束。 //----------------------------------------------------------------------------- static bool_t __wait_end_s29glxxx(u32 delay_us) { static u32 i=0; volatile u16 a,b; u16 c; i++; for(c=0;c<delay_us;c++) { a=*(u16 *)CN_FLASH_BASE_ADDR; b=*(u16 *)CN_FLASH_BASE_ADDR; if(a==b) return(true); Djy_DelayUs(1); //延时1uS } return(false); }
//----擦除sector等待操作完成----------------------------------------------------- //功能:利用s29glxxx的toggle功能,如果内部写或擦除操作正在进行,连续两次读(任意 // 地址)将得到0/1交替的结果,s29gl128p最大擦除时间是3.5s,s29gl256s最大擦除 // 时间为1.1s,为了兼容版本,此次取大值 //参数:无 //全局:cn_flash_base_addr,芯片基地址 //返回:true=完成查询,false=超时不结束。 //----------------------------------------------------------------------------- static bool_t __wait_erase_end_s29glxxx(void) { static u32 i=0; volatile u16 a,b; u16 c; i++; for(c=0;c<35;c++)//最大擦除时间为3.5S { a=*(u16 *)CN_FLASH_BASE_ADDR; b=*(u16 *)CN_FLASH_BASE_ADDR; if(a==b) return(true); Djy_DelayUs(100000); } return(false); }
// ============================================================================= // 功能:初始化板件所有GPIO功能,包括普通GPIO口,外设所用IO(如串口,网口等) // 参数:无 // 返回:true // 说明:该函数必须在所有外设功能启用前调用,建议在module-trim中Sys_ModuleInit第一个 // 函数调用 // ============================================================================= bool_t Board_GpioInit(void) { PIO_Configure(usart0_pin, PIO_LISTSIZE(usart0_pin)); PIO_Configure(usart1_pin, PIO_LISTSIZE(usart1_pin)); PIO_Configure(uart3_pin, PIO_LISTSIZE(uart3_pin)); PIO_Configure(Qspi_pin, PIO_LISTSIZE(Qspi_pin)); //硬件IO复位PHY芯片 PIO_Configure(Gmac_Reset_Pin, PIO_LISTSIZE(Gmac_Reset_Pin)); PIO_Clear(Gmac_Reset_Pin); Djy_DelayUs(1000); PIO_Set(Gmac_Reset_Pin); //GMAC的IO引脚初始化 PIO_Configure(Gmac_pin, PIO_LISTSIZE(Gmac_pin)); return true; }
// ============================================================================= // 功能:DM9000PHY芯片复位,并配置为自适应模式 // 参数:无 // 返回:无 // ============================================================================= bool_t DM9000_PhyInit(void) { u32 timeout = CN_PHY_INTIT_TIMEOUT; dm_reg_write(DM9000_GPCR,1); //设置GPIO0为输出 dm_reg_write(DM9000_GPR,0); //激活内部PHY Djy_DelayUs(3 * mS); dm_reg_write_phy(DM9000_BMCR,0x8000); Djy_DelayUs(30); while(dm_reg_read_phy(DM9000_BMCR) & 0x8000) { Djy_DelayUs(10*mS); timeout = timeout - 10*mS; if(timeout == 0) { DM9000_DBG("phy init failed !\r\n"); return false; } } DM9000_DBG("Phy Reset Success!\r\n"); dm_reg_write_phy(DM9000_BMCR,0x1200);//auto negotiation Djy_DelayUs(30); while(!(dm_reg_read_phy(DM9000_BMSR) & 0x20)) { Djy_DelayUs(10*mS); timeout = timeout - 10*mS; if(timeout == 0) { DM9000_DBG("phy init failed !\r\n"); return false; } } DM9000_DBG("auto negotiation completed!\r\n"); while(!(dm_reg_read_phy(DM9000_BMSR) & 0x04)) { Djy_DelayUs(10*mS); timeout = timeout - 10*mS; if(timeout == 0) { DM9000_DBG("phy init failed !\r\n"); return false; } } DM9000_DBG("phy linked!\r\n"); return true; }
static int __iic_write_addr (volatile tagI2CReg *dev, u8 devaddr, u8 dir) { unsigned time = 0; dev->CR1 |= I2C_CR1_PE_MASK;/*使能 IIC start*/ dev->CR1 |= I2C_CR1_START_MASK; while(!(dev->SR1&I2C_SR1_SB_MASK))//没有发送起始条件条件// { Djy_DelayUs(1); if(time++>(CONFIG_I2C_MBB_TIMEOUT))//???? return 0; //超时返回 } dev->DR = (devaddr << 1) | dir; /*写 地 址*/ if (__iic_wait_addr(dev,I2C_WRITE_BIT) < 0) return 0; return 1; }
static int __iic_wait_addr(volatile tagI2CReg *dev, int write) { uint16_t csr; unsigned timeout = 0; do { Djy_DelayUs(1); csr = dev->SR1; csr|=(u16)(dev->SR2<<16); if (!(csr & I2C_SR1_ADDR_MASK))//地址没有发送发送 continue; csr=dev->SR1; /*清状态寄存器标志*/ if (csr & I2C_SR1_ARLO_MASK) /*如果仲裁丢失*/ { #ifdef DEBUG printk("__i2c_wait: ARLO\n"); #endif return -1; } if (write == I2C_WRITE_BIT) /*写时*/ { if( (csr & I2C_SR1_AF_MASK))/*判断ack*/ { #ifdef DEBUG printk("__i2c_wait: No RXACK\n"); #endif return -1; } } return 0; } while (timeout++ < CONFIG_I2C_TIMEOUT);//0.01s超时 #ifdef DEBUG printk("__i2c_wait: timed out\n"); #endif return -1; }
// ============================================================================= // 功能:字符终端直接发送函数,采用轮询方式,直接写寄存器,用于printk,或者stdout // 没有初始化 // 参数:str,发送字符串指针 // len,发送的字节数 // 返回:0,发生错误;result,发送数据长度,字节单位 // ============================================================================= s32 Uart_PutStrDirect(const char *str,u32 len) { u32 result = 0,timeout = TxByteTime * len; u16 CR_Bak; CR_Bak = GetCharDirectReg->C2; //Save INT __UART_TxIntDisable(GetCharDirectReg); //disable send INT for(result=0; result < len+1; result ++) { // 超时或者发送缓冲为空时退出 while((false == __UART_TxTranEmpty(PutStrDirectReg))&& (timeout > 10)) { timeout -=10; Djy_DelayUs(10); } if( (timeout <= 10) || (result == len)) break; PutStrDirectReg->D = str[result]; } PutStrDirectReg->C2 = CR_Bak; //restore send INT return result; }
/*--------------------------------------------------------------------------- 功能: lcd 初始化 ---------------------------------------------------------------------------*/ void __lcd_ili9325_init(void) { GPIO_PowerOn(CN_GPIO_F); GPIO_PowerOn(CN_GPIO_G); GPIO_CfgPinFunc(CN_GPIO_F,10,CN_GPIO_MODE_GPIO_OUT_OD_2Mhz); GPIO_CfgPinFunc(CN_GPIO_G,8,CN_GPIO_MODE_GPIO_OUT_PP_2Mhz); lcd_backlight_off(); lcd_reset(); Djy_DelayUs(100000); if( __ili9325_read_reg() != 0x9325) { return; } __ili9325_write_reg(0x0000, 0x0001); //Start internal OSC __ili9325_write_reg(0x0001, 0x0000); // set SS=0 and SM=0 S1---S720 __ili9325_write_reg(0x0002, 0x0700); // set 1 line inversion __ili9325_write_reg(0x0003, 0x1030); // set GRAM write direction and BGR=1. __ili9325_write_reg(0x0004, 0x0000); // Resize register __ili9325_write_reg(0x0008, 0x0207); // set the back porch and front porch __ili9325_write_reg(0x0009, 0x0000); // set non-display area refresh cycle ISC[3:0] __ili9325_write_reg(0x000a, 0x0000); // FMARK function __ili9325_write_reg(0x000c, 0x0000); // RGB interface setting __ili9325_write_reg(0x000d, 0x0000); // Frame marker Position __ili9325_write_reg(0x000f, 0x0000); // RGB interface polarity //-------------power on sequence------------ __ili9325_write_reg(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB __ili9325_write_reg(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] __ili9325_write_reg(0x0012, 0x0000); // VREG1OUT voltage __ili9325_write_reg(0x0013, 0x0000); // VDV[4:0] for VCOM amplitude Djy_DelayUs(5000); __ili9325_write_reg(0x0010, 0x1690); // SAP, BT[3:0], AP, DSTB, SLP, STB __ili9325_write_reg(0x0011, 0x0227); // R11H=0x0221 at VCI=3.3V, DC1[2:0], DC0[2:0], VC[2:0] Djy_DelayUs(5000); __ili9325_write_reg(0x0012, 0x001d); // External reference voltage= Vci;001d Djy_DelayUs(5000); __ili9325_write_reg(0x0013, 0x0800); // R13H=1D00 when R12H=009D;VDV[4:0] for VCOM amplitude __ili9325_write_reg(0x0029, 0x0014); // R29H=0013 when R12H=009D;VCM[5:0] for VCOMH __ili9325_write_reg(0x002b, 0x000B); // Frame Rate = 96Hz Djy_DelayUs(5000); __ili9325_write_reg(0x0020, 0x0000); // GRAM horizontal Address __ili9325_write_reg(0x0021, 0x0000); // GRAM Vertical Address // ----------- Adjust the Gamma Curve ---------- __ili9325_write_reg(0x0030, 0x0007); __ili9325_write_reg(0x0031, 0x0707); __ili9325_write_reg(0x0032, 0x0006); __ili9325_write_reg(0x0035, 0x0704); __ili9325_write_reg(0x0036, 0x1F04); __ili9325_write_reg(0x0037, 0x0004); __ili9325_write_reg(0x0038, 0x0000); __ili9325_write_reg(0x0039, 0x0706); __ili9325_write_reg(0x003c, 0x0701); __ili9325_write_reg(0x003d, 0x000F); // ------------------ Set GRAM area --------------- __ili9325_write_reg(0x0050, 0x0000); // Horizontal GRAM Start Address __ili9325_write_reg(0x0051, 239); // Horizontal GRAM End Address __ili9325_write_reg(0x0052, 0x0000); // Vertical GRAM Start Address __ili9325_write_reg(0x0053, 319); // Vertical GRAM Start Address __ili9325_write_reg(0x0060, 0x2700); // GS=0 320 line __ili9325_write_reg(0x0061, 0x0001); // NDL,VLE(滚屏允许), REV(灰度翻转) __ili9325_write_reg(0x006a, 0x0000); // set scrolling line // -------------- Partial Display Control --------- __ili9325_write_reg(0x0080, 0x0000); __ili9325_write_reg(0x0081, 0x0000); __ili9325_write_reg(0x0082, 0x0000); __ili9325_write_reg(0x0083, 0x0000); __ili9325_write_reg(0x0084, 0x0000); __ili9325_write_reg(0x0085, 0x0000); // -------------- Panel Control ------------------- __ili9325_write_reg(0x0090, 0x0010); __ili9325_write_reg(0x0092, 0x0000); __ili9325_write_reg(0x0093, 0x0003); __ili9325_write_reg(0x0095, 0x0110); __ili9325_write_reg(0x0097, 0x0000); __ili9325_write_reg(0x0098, 0x0000); // Set GRAM write direction and BGR = 1 // I/D=11 (Horizontal : increment, Vertical : increment) // AM=0 (address is updated in Horizontal writing direction) __ili9325_write_reg(0x0003, 0x1030); __ili9325_write_reg(0x0007, 0x0173); // 262K color and display ON lcd_backlight_on(); }
void lcd_reset(void) { GPIO_SettoLow(CN_GPIO_G,0x100); Djy_DelayUs(5000); GPIO_SettoHigh(CN_GPIO_G,0x100); }
//----触摸屏校准--------------------------------------------------------------- //功能: 触摸屏的尺寸可能与液晶可显示区域不完全一致,安装也可能有偏差,需要计算 // 校准系数和偏移量。为获得更高精度,使用定点小数。 //参数: display_name,本触摸屏对应的显示器名(资源名) //返回: 无 //----------------------------------------------------------------------------- void touch_ratio_adjust(struct tagGkWinRsc *desktop) { struct tagSingleTouchMsg touch_xyz0,touch_xyz1; FILE *touch_init; s32 limit_left,limit_top,limit_right,limit_bottom,pen_down_time,step; if((touch_init = fopen("sys:\\touch_init.dat","r")) != NULL) { fread(&ts_cfg_data,sizeof(TS_CFG_DATA),1,touch_init); } else { limit_left = desktop->limit_left; limit_top = desktop->limit_top; limit_right = desktop->limit_right; limit_bottom = desktop->limit_bottom; // GK_ApiCreateGkwin(desktop,desktop,limit_left,limit_top,limit_right,limit_bottom, // CN_COLOR_WHITE,CN_WINBUF_BUF,"&tg_touch_adjust",CN_R3_SRCCOPY,0); // GK_ApiSetPrio(desktop,-1,CN_GK_SYNC); GK_ApiFillWin(desktop,CN_COLOR_WHITE,0); GK_ApiDrawText(desktop,NULL,NULL,limit_left+10,limit_top+50, "触摸屏矫正",21,CN_COLOR_WHITE,CN_R2_COPYPEN,0); GK_ApiDrawText(desktop,NULL,NULL,limit_left+10,limit_top+70, "请准确点击十字交叉点",21,CN_COLOR_WHITE,CN_R2_COPYPEN,0); step=0; while(step<4) { s32 adx,ady; if(step>0) { clr_cursor(desktop,ts_cal_ref_pos[step-1][0],ts_cal_ref_pos[step-1][1]); } draw_cursor(desktop,ts_cal_ref_pos[step][0],ts_cal_ref_pos[step][1]); while(ts_is_down()) { Djy_DelayUs(100*mS); } pen_down_time=0; while(1) { if(ts_is_down()) { ts_get_data_raw(&adx,&ady); if(pen_down_time++>5) { break; } } else { pen_down_time=0; } Djy_DelayUs(100*mS); } switch(step) { case 0: ts_cfg_data.LUAdx =adx; ts_cfg_data.LUAdy =ady; break; case 1: ts_cfg_data.RUAdx =adx; ts_cfg_data.RUAdy =ady; break; case 2: ts_cfg_data.RDAdx =adx; ts_cfg_data.RDAdy =ady; break; case 3: ts_cfg_data.LDAdx =adx; ts_cfg_data.LDAdy =ady; break; } printf("ts_cal[%d]: %04X,%04X\r\n",step,adx,ady); step++; } GK_ApiFillWin(desktop,CN_COLOR_WHITE,0); GK_ApiSyncShow(1000*mS); while(ts_is_down()) { Djy_DelayUs(100*mS); } Djy_DelayUs(500*mS); // GK_DestroyWin(desktop); touch_init = fopen("sys:\\touch_init.dat","w+"); fwrite(&ts_cfg_data,sizeof(TS_CFG_DATA),1,touch_init); } fclose(touch_init); }
//----发送一帧数据--------------------------------------------------------------- //功能:发送一个数据包到以太网上 //参数:upsec,上层数据包(一个链表结构)的头指针 //返回:正常时为发送的字节数;错误时为-1 //----------------------------------------------------------------------------- s32 __hw_write_out(struct enet_send_section *upsec) { u16 dat; u32 i, len, times, totlen; struct enet_send_section* pt_ssec; // 请求DM9000A硬件操作的信号量,如果没有发出去,则返回 if (Lock_SempPend(semp_dm9000, 0) == true) { Int_SaveAsynLine(cn_int_line_enet); // 关闭DM9000A的外部中断 totlen = 0; pt_ssec = upsec; ADDRW8(DM9000A_MWCMD); if (ehi.io == 0) // 16-bit { u8* pt_data; // 定义字节为8位的,下面进行强制转换 while (pt_ssec != NULL) { pt_data = (u8*)pt_ssec->data; len = pt_ssec->count; totlen += len; if ((ptu32_t)pt_data & 0x01) //判断指针是否双字节对齐 { for (i=0; i<len; i+=2) { dat = pt_data[i] + (pt_data[i+1]<<8); DATAW16(dat); } } else { times = (len+1)/2; for (i=0; i<times; i++) DATAW16(((u16*)pt_data)[i]); } pt_ssec = pt_ssec->next_data_ssection; } } else if (ehi.io == 1) // 32-bit { } else if (ehi.io == 2) // 8-bit { } if (totlen > 0) { iow(DM9000A_TXPLH, (totlen>>8) & 0xff); iow(DM9000A_TXPLL, totlen & 0xff); iow(DM9000A_NSR, 0x2c); // 清除状态寄存器 iow(DM9000A_TCR, ior(DM9000A_TCR) | 0x01); //发送数据到以太网上 // 等待发送完成 // NSR中TX1END及TX2END(发送完成) // ISR中PTM(发送完成) times = 100; // 相当等待于3S while (!(ior(DM9000A_NSR) & 0x0C) || !(ior(DM9000A_ISR) & 0x02)) { if (times == 0) { dm9000a_reset_to_new(); break ; } times--; Djy_DelayUs(10); } }
// ============================================================================= // 功能: 这个是直接写串口函数,不会经过事件弹出 // 参数: Reg,UART的寄存器基址. // send_buf,被发送的缓冲数据 // len,发送的数据字节数 // timeout,超时时间,微秒 // 返回: 发送的个数 // ============================================================================= u32 __UART_SendDirectly(tagUartReg* Reg,u8 *send_buf,u32 len,u32 timeout) { u32 result,Port; switch((u32)Reg) { //UART0和UART1的FIFO深度为8,而其他的为1 case CN_UART0_BASE:Port = CN_UART0; break; case CN_UART1_BASE:Port = CN_UART1;break; case CN_USART0_BASE:Port = CN_USART0;break; case CN_USART1_BASE:Port = CN_USART1; break; default:return 0; } __UART_SendIntDisable(Reg,s_UART_DmaUsed[Port]); // __UART_half_duplex_send(Port);//硬件使能发送 if(s_UART_DmaUsed[Port] == false) { for(result=0; result < len; result ++) { while((0 == __UART_TxTranEmpty(Reg)) && (timeout > 0))//超时或者发送缓冲为空时退出 { timeout--; Djy_DelayUs(1); } if(timeout == 0) break; Reg->UART_THR = send_buf[result]; } // //等待发送完再将485通信转为接收 // while((0 == __UART_TxTranEmpty(Reg)) // && (timeout > 0))//超时或者发送缓冲为空时退出 // { // timeout--; // Djy_DelayUs(1); // } // if(timeout == 0) // result = 0; } else { Reg->UART_PTCR = (1<<9);//disable dma send first if((Reg->UART_TCR==0)&&(Reg->UART_TNCR==0)) { Reg->UART_TPR = (uint32_t)send_buf; Reg->UART_TCR = len; Reg->UART_PTCR = (1<<8);//dma tx enbale } else result = 0; //直接发送方式,采用阻塞的DMA发送 while((!__UART_TxTranEmpty(Reg)) && (timeout > 0)) { timeout--; Djy_DelayUs(1); } if(timeout == 0) result = 0; } __UART_SendIntEnable(Reg,s_UART_DmaUsed[Port]); // __UART_half_duplex_recv(Port);//硬件使能接收 return result; }