Example #1
0
// =============================================================================
// 功能: 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;
}
Example #2
0
// =============================================================================
// 功能: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);
}
Example #3
0
//----写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);        // 由程序清零
}
Example #4
0
//----设置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
}
Example #5
0
//----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;
}
Example #6
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;
}
Example #7
0
//----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);
}
Example #8
0
//向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读操作
}
Example #9
0
// =============================================================================
// 功能: 配置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);
}
Example #10
0
//读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;
}
Example #11
0
// =============================================================================
// 功能: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;
}
Example #12
0
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;
}
Example #13
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;
}
Example #14
0
//----读写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);
}
Example #15
0
//----擦除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);
}
Example #16
0
File: board.c Project: djyos/djyos
// =============================================================================
// 功能:初始化板件所有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;
}
Example #17
0
// =============================================================================
// 功能: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;
}
Example #18
0
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;
}
Example #19
0
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;
}
Example #20
0
// =============================================================================
// 功能:字符终端直接发送函数,采用轮询方式,直接写寄存器,用于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;
}
Example #21
0
/*---------------------------------------------------------------------------
功能:    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();
}
Example #22
0
void lcd_reset(void)
{
    GPIO_SettoLow(CN_GPIO_G,0x100);
    Djy_DelayUs(5000);
    GPIO_SettoHigh(CN_GPIO_G,0x100);
}
Example #23
0
//----触摸屏校准---------------------------------------------------------------
//功能: 触摸屏的尺寸可能与液晶可显示区域不完全一致,安装也可能有偏差,需要计算
//      校准系数和偏移量。为获得更高精度,使用定点小数。
//参数: 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);

}
Example #24
0
//----发送一帧数据---------------------------------------------------------------
//功能:发送一个数据包到以太网上
//参数: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);
            }
        }
Example #25
0
// =============================================================================
// 功能: 这个是直接写串口函数,不会经过事件弹出
// 参数: 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;
}