コード例 #1
0
ファイル: encx24j600.c プロジェクト: SusumuMATSUI/RIOT-1
static int _init(netdev2_t *encdev)
{
    encx24j600_t *dev = (encx24j600_t *) encdev;

    DEBUG("encx24j600: starting initialization...\n");

    /* setup IO */
    gpio_init(dev->cs, GPIO_OUT);
    gpio_set(dev->cs);
    gpio_init_int(dev->int_pin, GPIO_IN_PU, GPIO_FALLING, encx24j600_isr, (void*)dev);

    if (spi_init_master(dev->spi, SPI_CONF_FIRST_RISING, ENCX24J600_SPI_SPEED) < 0) {
        return -1;
    }

    lock(dev);

    /* initialization procedure as described in data sheet (39935c.pdf) */
    do {
        do {
            xtimer_usleep(ENCX24J600_INIT_DELAY);
            reg_set(dev, ENC_EUDAST, 0x1234);
            xtimer_usleep(ENCX24J600_INIT_DELAY);
        } while (reg_get(dev, ENC_EUDAST) != 0x1234);

        while (!(reg_get(dev, ENC_ESTAT) & ENC_CLKRDY));

        /* issue System Reset */
        cmd(dev, ENC_SETETHRST);

        /* make sure initialization finalizes */
        xtimer_usleep(1000);
    } while (!(reg_get(dev, ENC_EUDAST) == 0x0000));

    /* configure flow control */
    phy_reg_set(dev, ENC_PHANA, 0x05E1);
    reg_set_bits(dev, ENC_ECON2, ENC_AUTOFC);

    /* setup receive buffer */
    reg_set(dev, ENC_ERXST, RX_BUFFER_START);
    reg_set(dev, ENC_ERXTAIL, RX_BUFFER_END);
    dev->rx_next_ptr = RX_BUFFER_START;

    /* configure receive filter to receive multicast frames */
    reg_set_bits(dev, ENC_ERXFCON, ENC_MCEN);

    /* setup interrupts */
    reg_set_bits(dev, ENC_EIE, ENC_PKTIE | ENC_LINKIE);
    cmd(dev, ENC_ENABLERX);
    cmd(dev, ENC_SETEIE);

    DEBUG("encx24j600: initialization complete.\n");

    unlock(dev);

#ifdef MODULE_NETSTATS_L2
    memset(&netdev->stats, 0, sizeof(netstats_t));
#endif
    return 0;
}
コード例 #2
0
/*
 * CPU power management and memory contorller power down
 */
void cpu_reset_all(void)
{
	unsigned int reg_data;
	void __iomem *pwctrl = __io_address(PRCM_PWCTRL);
/*
	for(i=2; i<8; i++)
	{
		reg_clr_bits(pwctrl, 1 << i);
		udelay(10);
		reg_set_bits(pwctrl, 1 << i);
		udelay(10);
	}
*/
	/* cpu1 soft reset */
	reg_data = (PRCM_PWCTRL_DBG1_SW_RST | PRCM_PWCTRL_DBG0_SW_RST |
		PRCM_PWCTRL_WD1_SW_RST | PRCM_PWCTRL_WD0_SW_RST |
		PRCM_PWCTRL_NEON1_SW_RST | PRCM_PWCTRL_NEON0_SW_RST |
		PRCM_PWCTRL_CPU1_SW_RST); 

	reg_clr_bits(pwctrl, reg_data);
	reg_set_bits(pwctrl, reg_data);

	/* cpu0 soft reset */
	reg_data = (PRCM_PWCTRL_DBG1_SW_RST | PRCM_PWCTRL_DBG0_SW_RST |
		PRCM_PWCTRL_WD1_SW_RST | PRCM_PWCTRL_WD0_SW_RST |
		PRCM_PWCTRL_NEON1_SW_RST | PRCM_PWCTRL_NEON0_SW_RST |
		PRCM_PWCTRL_CPU0_SW_RST); 

	reg_clr_bits(pwctrl, reg_data);
	reg_set_bits(pwctrl, reg_data);

	printk(KERN_NOTICE "cpu reset over!\n");
}
コード例 #3
0
/*clk gating ctl.
 *scm_pclk cannot close, if close, all clock can not run.
 */
void clk_gating(void)
{
	unsigned int i;
	void __iomem *clk1_ctrl = __io_address(PRCM_CLK1_CTRL);
	void __iomem *clk2_ctrl = __io_address(PRCM_CLK2_CTRL);

	udelay(2000);

	for(i = 0; i < 7; i++)
 	{
		reg_clr_bits(clk1_ctrl, 1 << i);
		udelay(10);	
		reg_set_bits(clk1_ctrl, 1 << i);
		udelay(10);
	}

	for(i = 0; i < 30; i++)
	{
		if(i >= 18 && i<= 20)
			continue;
	
		reg_clr_bits(clk2_ctrl, 1 << i);	
		udelay(10);
		reg_set_bits(clk2_ctrl, 1 << i);
		udelay(10);
	}	
	printk(KERN_NOTICE "clock gating over!\n");
	udelay(80);
}
コード例 #4
0
/*switch cpu freq: 800MHz, 1066MHz, 1200MHz, 1333MHz, 1600MHz, 2000MHz
 *software dynamic switch cpu feq: 
 *	must set system freq mode update register [6] = 1
 *cpumode: cpu/axi/ahb ddr pll4
 */
void set_cpu_mode(unsigned int cpu_mode)
{
	void __iomem *mode_ctrl = __io_address(PRCM_SYSFREQ_MODE_CTRL);

	//clr CPU_FREQ_FRESH = 0
	reg_clr_bits(mode_ctrl, (1 << 5));
	reg_clr_bits(mode_ctrl, PRCM_SYSF_MODE_CPU_MASK);
	//set cpu freq
	reg_set_bits(mode_ctrl, PRCM_SYSF_MODE_CPU_FREQ_SW_EN | cpu_mode);

	//set CPU_FREQ_FRESH = 1
	reg_set_bits(mode_ctrl, (1 << 5));

	//wait for 100us to stable		
	udelay(100);
}
コード例 #5
0
/*
 * Global software reset control
 * posedge trigger a global software reset
 * NOTICE: global reset can not reset prcm registers
 */
void prcm_glb_soft_reset(void)
{
	void __iomem *ctrl = __io_address(PRCM_RSTCTRL);
	reg_clr_bits(ctrl, PRCM_RSTCTRL_GLB_SW_RST); //0
	reg_set_bits(ctrl, PRCM_RSTCTRL_GLB_SW_RST);//1
//	printk(KERN_EMERG "globle soft reset over!\n");
}
コード例 #6
0
void ns2816_i2sclk_set_rate(unsigned int rate)
{
	void __iomem *sel_ctrl = __io_address(PRCM_CLK_SEL_CTRL);

	reg_clr_bits(sel_ctrl, PRCM_CLK_SEL_I2S_CLK_MASK);
	reg_set_bits(sel_ctrl, rate);

	printk(KERN_NOTICE "Already set I2S clock to %d .\n", rate);
}
コード例 #7
0
void prcm_usb_reset(void)
{
	unsigned int reg_value = 0;
	void __iomem *rst_usb = __io_address(PRCM_RSTCTRL_USB);

	reg_clr_bits(rst_usb, PRCM_RSTCTRL_USB_RST);	//0
	udelay(4);	
	reg_set_bits(rst_usb, PRCM_RSTCTRL_USB_RST);	//1
	udelay(800); //keep high to usb work normally

	reg_value = PRCM_RSTCTRL_USB_RST_PORT0 | PRCM_RSTCTRL_USB_RST_PORT1 |
			PRCM_RSTCTRL_USB_RST_PORT2 | PRCM_RSTCTRL_USB_RST_PORT3 ;

	//port reset is level trigger and high trigger reset.
	reg_set_bits(rst_usb, reg_value); //1
	udelay(100); 
	reg_clr_bits(rst_usb, reg_value); //0

	printk(KERN_NOTICE "usb reset...\n");
}
コード例 #8
0
/* usb ref clk switch
 * set switch clk
 * reset usb
 */
void prcm_usb_sel_refclk(unsigned int refclk_sel, unsigned int refclk_div)
{
	unsigned int reg_value = 0;
	void __iomem *usb_refclk = __io_address(PRCM_RSTCTRL_USB_REFCLK);

	reg_value = __raw_readl(usb_refclk);

	if((refclk_sel == (reg_value & PRCM_RST_CTRL_USB_REFCLK_SEL_MASK) ) 
	    && (refclk_div == (reg_value & PRCM_RST_CTRL_USB_REFCLK_DIV_MASK)))
	{
		printk(KERN_NOTICE "usb reference clock is already set to what your want! return.\n");
		return;
	}

	reg_clr_bits(usb_refclk, PRCM_RST_CTRL_USB_REFCLK_SEL_MASK);
	reg_set_bits(usb_refclk, refclk_sel);
 
	reg_clr_bits(usb_refclk, PRCM_RST_CTRL_USB_REFCLK_DIV_MASK);
	reg_set_bits(usb_refclk, refclk_div); 

	printk(KERN_NOTICE "alread set usb clock, refcle sel is %d, refclk divider is %d .\n"
		, refclk_sel, refclk_div);	
}
コード例 #9
0
/*
 *reset and enable watchdog
 */
void watchdog_reset_enable(void)
{
	void __iomem *ctrl = __io_address(PRCM_RSTCTRL);
	void __iomem *private_watchdog = __io_address(NS2816_GTIMER_BASE);
	unsigned int value = 0;

	//enable watchdog reset
	reg_set_bits(ctrl, PRCM_RSTCTRL_WDRESET_EN);

	//watchdog control register
	__raw_writel(0, private_watchdog + NS2816_SYS_WATCHDOG_CONTROL);
	//watchdog load register
	__raw_writel(0x00200, private_watchdog + NS2816_SYS_WATCHDOG_LOAD);

	value = (NS2816_SYS_WATCHDOG_CONTROL_ENABLE | NS2816_SYS_WATCHDOG_CONTROL_MODE);
	__raw_writel(value, private_watchdog + NS2816_SYS_WATCHDOG_CONTROL);
}
コード例 #10
0
void prcm_dll_soft_reset(unsigned int i)
{
	void __iomem *dll_rst = __io_address(PRCM_RSTCTRL_DLL);

	reg_set_bits(dll_rst, (0x1 << i));
}