parent
50752790bc
commit
ae691e5719
@ -0,0 +1,110 @@ |
||||
/*
|
||||
* (C) Copyright 2009 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* Original Author Guenter Gebhardt |
||||
* Copyright (C) 2006 Micronas GmbH |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
|
||||
#include "vct.h" |
||||
|
||||
int vct_ehci_hcd_init(u32 *hccr, u32 *hcor) |
||||
{ |
||||
int retval; |
||||
u32 val; |
||||
u32 addr; |
||||
|
||||
dcgu_set_reset_switch(DCGU_HW_MODULE_USB_24, DCGU_SWITCH_ON); |
||||
dcgu_set_reset_switch(DCGU_HW_MODULE_USB_60, DCGU_SWITCH_ON); |
||||
dcgu_set_clk_switch(DCGU_HW_MODULE_USB_24, DCGU_SWITCH_ON); |
||||
dcgu_set_clk_switch(DCGU_HW_MODULE_USB_PLL, DCGU_SWITCH_ON); |
||||
dcgu_set_reset_switch(DCGU_HW_MODULE_USB_24, DCGU_SWITCH_OFF); |
||||
|
||||
/* Wait until (DCGU_USBPHY_STAT == 7) */ |
||||
addr = DCGU_USBPHY_STAT(DCGU_BASE); |
||||
val = reg_read(addr); |
||||
while (val != 7) |
||||
val = reg_read(addr); |
||||
|
||||
dcgu_set_clk_switch(DCGU_HW_MODULE_USB_60, DCGU_SWITCH_ON); |
||||
dcgu_set_reset_switch(DCGU_HW_MODULE_USB_60, DCGU_SWITCH_OFF); |
||||
|
||||
retval = scc_reset(SCC_USB_RW, 0); |
||||
if (retval) { |
||||
printf("scc_reset(SCC_USB_RW, 0) returned: 0x%x\n", retval); |
||||
return retval; |
||||
} else { |
||||
retval = scc_reset(SCC_CPU1_SPDMA_RW, 0); |
||||
if (retval) { |
||||
printf("scc_reset(SCC_CPU1_SPDMA_RW, 0) returned: 0x%x\n", |
||||
retval); |
||||
return retval; |
||||
} |
||||
} |
||||
|
||||
if (!retval) { |
||||
/*
|
||||
* For the AGU bypass, where the SCC client provides full |
||||
* physical address |
||||
*/ |
||||
scc_set_usb_address_generation_mode(1); |
||||
scc_setup_dma(SCC_USB_RW, BCU_USB_BUFFER_1, DMA_LINEAR, |
||||
USE_NO_FH, DMA_READ, 0); |
||||
scc_setup_dma(SCC_CPU1_SPDMA_RW, BCU_USB_BUFFER_1, DMA_LINEAR, |
||||
USE_NO_FH, DMA_WRITE, 0); |
||||
scc_setup_dma(SCC_USB_RW, BCU_USB_BUFFER_0, DMA_LINEAR, |
||||
USE_NO_FH, DMA_WRITE, 0); |
||||
scc_setup_dma(SCC_CPU1_SPDMA_RW, BCU_USB_BUFFER_0, DMA_LINEAR, |
||||
USE_NO_FH, DMA_READ, 0); |
||||
|
||||
/* Enable memory interface */ |
||||
scc_enable(SCC_USB_RW, 1); |
||||
|
||||
/* Start (start_cmd=0) DMAs */ |
||||
scc_dma_cmd(SCC_USB_RW, DMA_START, 0, DMA_READ); |
||||
scc_dma_cmd(SCC_USB_RW, DMA_START, 0, DMA_WRITE); |
||||
} else { |
||||
printf("Cannot configure USB memory channel.\n"); |
||||
printf("USB can not access RAM. SCC configuration failed.\n"); |
||||
return retval; |
||||
} |
||||
|
||||
/* Wait a short while */ |
||||
udelay(300000); |
||||
|
||||
reg_write(USBH_BURSTSIZE(USBH_BASE), 0x00001c1c); |
||||
|
||||
/* Set EHCI structures and DATA in RAM */ |
||||
reg_write(USBH_USBHMISC(USBH_BASE), 0x00840003); |
||||
/* Set USBMODE to bigendian and set host mode */ |
||||
reg_write(USBH_USBMODE(USBH_BASE), 0x00000007); |
||||
|
||||
/*
|
||||
* USBH_BURSTSIZE MUST EQUAL 0x00001c1c in order for |
||||
* 512 byte USB transfers on the bulk pipe to work properly. |
||||
* Set USBH_BURSTSIZE to 0x00001c1c |
||||
*/ |
||||
reg_write(USBH_BURSTSIZE(USBH_BASE), 0x00001c1c); |
||||
|
||||
/* Insert access register addresses */ |
||||
*hccr = REG_GLOBAL_START_ADDR + USBH_CAPLENGTH(USBH_BASE); |
||||
*hcor = REG_GLOBAL_START_ADDR + USBH_USBCMD(USBH_BASE); |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,88 @@ |
||||
/*
|
||||
* (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include "vct.h" |
||||
|
||||
/*
|
||||
* Find out to which of the 2 gpio modules the pin specified in the |
||||
* argument belongs: |
||||
* GPIO_MODULE yields 0 for pins 0 to 31, |
||||
* 1 for pins 32 to 63 |
||||
*/ |
||||
#define GPIO_MODULE(pin) ((pin) >> 5) |
||||
|
||||
/*
|
||||
* Bit position within a 32-bit peripheral register (where every |
||||
* bit is one bitslice) |
||||
*/ |
||||
#define MASK(pin) (1 << ((pin) & 0x1F)) |
||||
#define BASE_ADDR(mod) module_base[mod] |
||||
|
||||
/*
|
||||
* Lookup table for transforming gpio module number 0 to 2 to |
||||
* address offsets |
||||
*/ |
||||
static u32 module_base[] = { |
||||
GPIO1_BASE, |
||||
GPIO2_BASE |
||||
}; |
||||
|
||||
static void clrsetbits(u32 addr, u32 and_mask, u32 or_mask) |
||||
{ |
||||
reg_write(addr, (reg_read(addr) & ~and_mask) | or_mask); |
||||
} |
||||
|
||||
int vct_gpio_dir(int pin, int dir) |
||||
{ |
||||
u32 gpio_base; |
||||
|
||||
gpio_base = BASE_ADDR(GPIO_MODULE(pin)); |
||||
|
||||
if (dir == 0) |
||||
clrsetbits(GPIO_SWPORTA_DDR(gpio_base), MASK(pin), 0); |
||||
else |
||||
clrsetbits(GPIO_SWPORTA_DDR(gpio_base), 0, MASK(pin)); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void vct_gpio_set(int pin, int val) |
||||
{ |
||||
u32 gpio_base; |
||||
|
||||
gpio_base = BASE_ADDR(GPIO_MODULE(pin)); |
||||
|
||||
if (val == 0) |
||||
clrsetbits(GPIO_SWPORTA_DR(gpio_base), MASK(pin), 0); |
||||
else |
||||
clrsetbits(GPIO_SWPORTA_DR(gpio_base), 0, MASK(pin)); |
||||
} |
||||
|
||||
int vct_gpio_get(int pin) |
||||
{ |
||||
u32 gpio_base; |
||||
u32 value; |
||||
|
||||
gpio_base = BASE_ADDR(GPIO_MODULE(pin)); |
||||
value = reg_read(GPIO_EXT_PORTA(gpio_base)); |
||||
|
||||
return ((value & MASK(pin)) ? 1 : 0); |
||||
} |
@ -0,0 +1,669 @@ |
||||
/*
|
||||
* (C) Copyright 2009 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* Copyright (C) 2006 Micronas GmbH |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/errno.h> |
||||
|
||||
#include "vct.h" |
||||
|
||||
/*
|
||||
* List of statically defined buffers per SCC. |
||||
* The first entry in the table is the number of fixed buffers |
||||
* followed by the list of buffer IDs |
||||
*/ |
||||
static u32 buffer_list_0[] = { 6, 120, 121, 122, 123, 139, 140 }; |
||||
static u32 buffer_list_1[] = { 6, 120, 121, 122, 123, 139, 140 }; |
||||
static u32 buffer_list_2[] = { 5, 124, 125, 126, 139, 140 }; |
||||
static u32 buffer_list_3[] = { 5, 124, 125, 126, 139, 140 }; |
||||
static u32 buffer_list_4[] = { 5, 124, 125, 126, 139, 140 }; |
||||
static u32 buffer_list_5[] = { 3, 127, 139, 140 }; |
||||
static u32 buffer_list_6[] = { 3, 127, 139, 140 }; |
||||
static u32 buffer_list_7[] = { 6, 128, 129, 130, 131, 139, 140 }; |
||||
static u32 buffer_list_8[] = { 6, 128, 129, 130, 131, 139, 140 }; |
||||
static u32 buffer_list_9[] = { 5, 124, 125, 126, 139, 140 }; |
||||
static u32 buffer_list_10[] = { 5, 124, 125, 126, 139, 140 }; |
||||
static u32 buffer_list_11[] = { 5, 124, 125, 126, 139, 140 }; |
||||
static u32 buffer_list_12[] = { 6, 132, 133, 134, 135, 139, 140 }; |
||||
static u32 buffer_list_13[] = { 6, 132, 133, 134, 135, 139, 140 }; |
||||
static u32 buffer_list_14[] = { 4, 137, 138, 139, 140 }; |
||||
static u32 buffer_list_15[] = { 6, 136, 136, 137, 138, 139, 140 }; |
||||
|
||||
/** Issue#7674 (new) - DP/DVP buffer assignment */ |
||||
static u32 buffer_list_16[] = { 6, 106, 108, 109, 107, 139, 140 }; |
||||
static u32 buffer_list_17[] = { 6, 106, 110, 107, 111, 139, 140 }; |
||||
static u32 buffer_list_18[] = { 6, 106, 113, 107, 114, 139, 140 }; |
||||
static u32 buffer_list_19[] = { 3, 112, 139, 140 }; |
||||
static u32 buffer_list_20[] = { 35, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
79, 80, 81, 82, 83, 84, 85, 86, 139, 140 }; |
||||
static u32 buffer_list_21[] = { 27, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
139, 140 }; |
||||
static u32 buffer_list_22[] = { 81, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, |
||||
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, |
||||
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, |
||||
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, |
||||
73, 74, 75, 76, 77, 78, 139, 140 }; |
||||
static u32 buffer_list_23[] = { 29, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
88, 89, 139, 140 }; |
||||
static u32 buffer_list_24[] = { 6, 90, 91, 92, 93, 139, 140 }; |
||||
static u32 buffer_list_25[] = { 18, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, |
||||
100, 101, 102, 103, 104, 105, 139, 140 }; |
||||
static u32 buffer_list_26[] = { 5, 94, 95, 96, 139, 140 }; |
||||
static u32 buffer_list_27[] = { 5, 97, 98, 99, 139, 140 }; |
||||
static u32 buffer_list_28[] = { 5, 100, 101, 102, 139, 140 }; |
||||
static u32 buffer_list_29[] = { 5, 103, 104, 105, 139, 140 }; |
||||
static u32 buffer_list_30[] = { 10, 108, 109, 110, 111, 113, 114, 116, 117, |
||||
139, 140 }; |
||||
static u32 buffer_list_31[] = { 13, 106, 107, 108, 109, 110, 111, 113, 114, |
||||
115, 116, 117, 139, 140 }; |
||||
static u32 buffer_list_32[] = { 13, 106, 107, 108, 109, 110, 111, 113, 114, |
||||
115, 116, 117, 139, 140 }; |
||||
static u32 buffer_list_33[] = { 27, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
139, 140 }; |
||||
static u32 buffer_list_34[] = { 27, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
139, 140 }; |
||||
static u32 buffer_list_35[] = { 28, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
87, 139, 140 }; |
||||
static u32 buffer_list_36[] = { 28, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
87, 139, 140 }; |
||||
static u32 buffer_list_37[] = { 27, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
139, 140 }; |
||||
static u32 buffer_list_38[] = { 29, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
118, 119, 139, 140 }; |
||||
static u32 buffer_list_39[] = { 91, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
||||
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
||||
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, |
||||
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, |
||||
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, |
||||
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, |
||||
73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, |
||||
85, 86, 118, 119, 139, 140 }; |
||||
static u32 buffer_list_40[] = { 0 }; |
||||
|
||||
/*
|
||||
* List of statically defined vcid.csize values. |
||||
* The first entry in the table is the number of possible csize values |
||||
* followed by the list of data path values in bits. |
||||
*/ |
||||
static u32 csize_list_0[] = { 2, 0, 1 }; |
||||
static u32 csize_list_1[] = { 2, 0, 1 }; |
||||
static u32 csize_list_2[] = { 1, 1 }; |
||||
static u32 csize_list_3[] = { 1, 1 }; |
||||
static u32 csize_list_4[] = { 1, 1 }; |
||||
static u32 csize_list_5[] = { 1, 0 }; |
||||
static u32 csize_list_6[] = { 1, 0 }; |
||||
static u32 csize_list_7[] = { 1, 1 }; |
||||
static u32 csize_list_8[] = { 1, 1 }; |
||||
static u32 csize_list_9[] = { 1, 1 }; |
||||
static u32 csize_list_10[] = { 1, 1 }; |
||||
static u32 csize_list_11[] = { 1, 1 }; |
||||
static u32 csize_list_12[] = { 1, 1 }; |
||||
static u32 csize_list_13[] = { 1, 1 }; |
||||
static u32 csize_list_14[] = { 1, 2 }; |
||||
static u32 csize_list_15[] = { 1, 4 }; |
||||
static u32 csize_list_16[] = { 3, 0, 1, 2 }; |
||||
static u32 csize_list_17[] = { 3, 0, 1, 2 }; |
||||
static u32 csize_list_18[] = { 3, 0, 1, 2 }; |
||||
static u32 csize_list_19[] = { 1, 2 }; |
||||
static u32 csize_list_20[] = { 1, 0 }; |
||||
static u32 csize_list_21[] = { 1, 0 }; |
||||
static u32 csize_list_22[] = { 1, 2 }; |
||||
static u32 csize_list_23[] = { 1, 3 }; |
||||
static u32 csize_list_24[] = { 1, 3 }; |
||||
static u32 csize_list_25[] = { 1, 3 }; |
||||
static u32 csize_list_26[] = { 1, 0 }; |
||||
static u32 csize_list_27[] = { 1, 0 }; |
||||
static u32 csize_list_28[] = { 1, 0 }; |
||||
static u32 csize_list_29[] = { 1, 0 }; |
||||
static u32 csize_list_30[] = { 1, 2 }; |
||||
static u32 csize_list_31[] = { 1, 2 }; |
||||
static u32 csize_list_32[] = { 1, 2 }; |
||||
static u32 csize_list_33[] = { 1, 2 }; |
||||
static u32 csize_list_34[] = { 1, 2 }; |
||||
static u32 csize_list_35[] = { 1, 2 }; |
||||
static u32 csize_list_36[] = { 1, 2 }; |
||||
static u32 csize_list_37[] = { 2, 0, 1 }; |
||||
static u32 csize_list_38[] = { 1, 2 }; |
||||
static u32 csize_list_39[] = { 1, 3 }; |
||||
static u32 csize_list_40[] = { 1, 3 }; |
||||
|
||||
/*
|
||||
* SCC_Configuration table |
||||
*/ |
||||
static const struct scc_descriptor scc_descriptor_table[] = { |
||||
/* scn scc_name profile SCC scc_id mci_id rd wr m p fh si cfg sta */ |
||||
{"fe_", "fe_3dcomb_wr", STRM_P, SCC0_BASE, 0, 0, 0, 4, 1, 1, 0, 0, 0, 1, |
||||
buffer_list_0, csize_list_0}, |
||||
{"fe_", "fe_3dcomb_rd", STRM_P, SCC1_BASE, 1, 18, 4, 0, 1, 1, 0, 1, 0, |
||||
1, buffer_list_1, csize_list_1}, |
||||
{"di_", "di_tnr_wr", STRM_P, SCC2_BASE, 2, 1, 0, 3, 1, 1, 0, 2, 0, 1, |
||||
buffer_list_2, csize_list_2}, |
||||
{"di_", "di_tnr_field_rd", STRM_P, SCC3_BASE, 3, 19, 3, 0, 1, 1, 0, 3, |
||||
0, 1, buffer_list_3, csize_list_3}, |
||||
{"di_", "di_tnr_frame_rd", STRM_P, SCC4_BASE, 4, 20, 3, 0, 1, 1, 0, 4, |
||||
0, 1, buffer_list_4, csize_list_4}, |
||||
{"di_", "di_mval_wr", STRM_P, SCC5_BASE, 5, 2, 0, 1, 1, 1, 0, 5, 0, 1, |
||||
buffer_list_5, csize_list_5}, |
||||
{"di_", "di_mval_rd", STRM_P, SCC6_BASE, 6, 21, 1, 0, 1, 1, 0, 6, 0, 1, |
||||
buffer_list_6, csize_list_6}, |
||||
{"rc_", "rc_frame_wr", STRM_P, SCC7_BASE, 7, 3, 0, 4, 1, 1, 0, 7, 0, 1, |
||||
buffer_list_7, csize_list_7}, |
||||
{"rc_", "rc_frame0_rd", STRM_P, SCC8_BASE, 8, 22, 4, 0, 1, 1, 0, 8, 0, |
||||
1, buffer_list_8, csize_list_8}, |
||||
{"opt", "opt_field0_rd", STRM_P, SCC9_BASE, 9, 23, 3, 0, 1, 1, 0, 9, 0, |
||||
1, buffer_list_9, csize_list_9}, |
||||
{"opt", "opt_field1_rd", STRM_P, SCC10_BASE, 10, 24, 3, 0, 1, 1, 0, 10, |
||||
0, 1, buffer_list_10, csize_list_10}, |
||||
{"opt", "opt_field2_rd", STRM_P, SCC11_BASE, 11, 25, 3, 0, 1, 1, 0, 11, |
||||
0, 1, buffer_list_11, csize_list_11}, |
||||
{"pip", "pip_frame_wr", STRM_P, SCC12_BASE, 12, 4, 0, 4, 1, 1, 0, 12, 0, |
||||
1, buffer_list_12, csize_list_12}, |
||||
{"pip", "pip_frame_rd", STRM_P, SCC13_BASE, 13, 26, 4, 0, 1, 1, 0, 13, |
||||
0, 1, buffer_list_13, csize_list_13}, |
||||
{"dp_", "dp_agpu_rd", STRM_P, SCC14_BASE, 14, 27, 2, 0, 2, 1, 0, 14, 0, |
||||
1, buffer_list_14, csize_list_14}, |
||||
{"ewa", "ewarp_rw", SRMD, SCC15_BASE, 15, 11, 1, 1, 0, 0, 0, -1, 0, 0, |
||||
buffer_list_15, csize_list_15}, |
||||
{"dp_", "dp_osd_rd", STRM_P, SCC16_BASE, 16, 28, 3, 0, 2, 1, 0, 15, 0, |
||||
1, buffer_list_16, csize_list_16}, |
||||
{"dp_", "dp_graphic_rd", STRM_P, SCC17_BASE, 17, 29, 3, 0, 2, 1, 0, 16, |
||||
0, 1, buffer_list_17, csize_list_17}, |
||||
{"dvp", "dvp_osd_rd", STRM_P, SCC18_BASE, 18, 30, 2, 0, 2, 1, 0, 17, 0, |
||||
1, buffer_list_18, csize_list_18}, |
||||
{"dvp", "dvp_vbi_rd", STRM_D, SCC19_BASE, 19, 31, 1, 0, 0, 1, 0, -1, 0, |
||||
0, buffer_list_19, csize_list_19}, |
||||
{"tsi", "tsio_wr", STRM_P, SCC20_BASE, 20, 5, 0, 8, 2, 1, 1, -1, 0, 0, |
||||
buffer_list_20, csize_list_20}, |
||||
{"tsi", "tsio_rd", STRM_P, SCC21_BASE, 21, 32, 4, 0, 2, 1, 1, -1, 0, 0, |
||||
buffer_list_21, csize_list_21}, |
||||
{"tsd", "tsd_wr", SRMD, SCC22_BASE, 22, 6, 0, 64, 0, 0, 1, -1, 0, 0, |
||||
buffer_list_22, csize_list_22}, |
||||
{"vd_", "vd_ud_st_rw", SRMD, SCC23_BASE, 23, 12, 2, 2, 0, 0, 1, -1, 0, |
||||
0, buffer_list_23, csize_list_23}, |
||||
{"vd_", "vd_frr_rd", SRMD, SCC24_BASE, 24, 33, 4, 0, 0, 0, 0, -1, 0, 0, |
||||
buffer_list_24, csize_list_24}, |
||||
{"vd_", "vd_frw_disp_wr", SRMD, SCC25_BASE, 25, 7, 0, 16, 0, 0, 0, -1, |
||||
0, 0, buffer_list_25, csize_list_25}, |
||||
{"mr_", "mr_vd_m_y_rd", STRM_P, SCC26_BASE, 26, 34, 3, 0, 2, 1, 0, 18, |
||||
0, 1, buffer_list_26, csize_list_26}, |
||||
{"mr_", "mr_vd_m_c_rd", STRM_P, SCC27_BASE, 27, 35, 3, 0, 2, 1, 0, 19, |
||||
0, 1, buffer_list_27, csize_list_27}, |
||||
{"mr_", "mr_vd_s_y_rd", STRM_P, SCC28_BASE, 28, 36, 3, 0, 2, 1, 0, 20, |
||||
0, 1, buffer_list_28, csize_list_28}, |
||||
{"mr_", "mr_vd_s_c_rd", STRM_P, SCC29_BASE, 29, 37, 3, 0, 2, 1, 0, 21, |
||||
0, 1, buffer_list_29, csize_list_29}, |
||||
{"ga_", "ga_wr", STRM_P, SCC30_BASE, 30, 8, 0, 1, 1, 1, 0, -1, 1, 1, |
||||
buffer_list_30, csize_list_30}, |
||||
{"ga_", "ga_src1_rd", STRM_P, SCC31_BASE, 31, 38, 1, 0, 1, 1, 0, -1, 1, |
||||
1, buffer_list_31, csize_list_31}, |
||||
{"ga_", "ga_src2_rd", STRM_P, SCC32_BASE, 32, 39, 1, 0, 1, 1, 0, -1, 1, |
||||
1, buffer_list_32, csize_list_32}, |
||||
{"ad_", "ad_rd", STRM_D, SCC33_BASE, 33, 40, 2, 0, 0, 1, 1, -1, 0, 0, |
||||
buffer_list_33, csize_list_33}, |
||||
{"ad_", "ad_wr", STRM_D, SCC34_BASE, 34, 9, 0, 3, 0, 1, 1, -1, 0, 0, |
||||
buffer_list_34, csize_list_34}, |
||||
{"abp", "abp_rd", STRM_D, SCC35_BASE, 35, 41, 5, 0, 0, 1, 1, -1, 0, 0, |
||||
buffer_list_35, csize_list_35}, |
||||
{"abp", "abp_wr", STRM_D, SCC36_BASE, 36, 10, 0, 3, 0, 1, 1, -1, 0, 0, |
||||
buffer_list_36, csize_list_36}, |
||||
{"ebi", "ebi_rw", STRM_P, SCC37_BASE, 37, 13, 4, 4, 2, 1, 1, -1, 0, 0, |
||||
buffer_list_37, csize_list_37}, |
||||
{"usb", "usb_rw", SRMD, SCC38_BASE, 38, 14, 1, 1, 0, 0, 1, -1, 0, 0, |
||||
buffer_list_38, csize_list_38}, |
||||
{"cpu", "cpu1_spdma_rw", SRMD, SCC39_BASE, 39, 15, 1, 1, 0, 0, 1, -1, 0, |
||||
0, buffer_list_39, csize_list_39}, |
||||
{"cpu", "cpu1_bridge_rw", SRMD, SCC40_BASE, 40, 16, 0, 0, 0, 0, 0, -1, |
||||
0, 0, buffer_list_40, csize_list_40}, |
||||
}; |
||||
|
||||
/* DMA state structures for read and write channels for each SCC */ |
||||
|
||||
static struct scc_dma_state scc_state_rd_0[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_0[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_1[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_1[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_2[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_2[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_3[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_3[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_4[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_4[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_5[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_5[] = { {0} }; |
||||
static struct scc_dma_state scc_state_rd_6[] = { {0} }; |
||||
static struct scc_dma_state scc_state_wr_6[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_7[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_7[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_8[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_8[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_9[] = { {0}, {0}, {0}, }; |
||||
static struct scc_dma_state scc_state_wr_9[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_10[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_10[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_11[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_11[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_12[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_12[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_13[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_13[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_14[] = { {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_14[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_15[] = { {0} }; |
||||
static struct scc_dma_state scc_state_wr_15[] = { {0} }; |
||||
static struct scc_dma_state scc_state_rd_16[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_16[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_17[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_17[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_18[] = { {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_18[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_19[] = { {0} }; |
||||
static struct scc_dma_state scc_state_wr_19[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_20[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_20[] = { |
||||
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_21[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_21[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_22[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_22[] = { |
||||
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, |
||||
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, |
||||
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, |
||||
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, |
||||
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_23[] = { {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_23[] = { {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_24[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_24[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_25[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_25[] = { |
||||
{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, |
||||
{0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_26[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_26[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_27[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_27[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_28[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_28[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_29[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_29[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_30[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_30[] = { {0} }; |
||||
static struct scc_dma_state scc_state_rd_31[] = { {0} }; |
||||
static struct scc_dma_state scc_state_wr_31[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_32[] = { {0} }; |
||||
static struct scc_dma_state scc_state_wr_32[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_33[] = { {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_33[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_34[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_34[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_35[] = { {0}, {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_35[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_rd_36[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_36[] = { {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_37[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_wr_37[] = { {0}, {0}, {0}, {0} }; |
||||
static struct scc_dma_state scc_state_rd_38[] = { {0} }; |
||||
static struct scc_dma_state scc_state_wr_38[] = { {0} }; |
||||
static struct scc_dma_state scc_state_rd_39[] = { {0} }; |
||||
static struct scc_dma_state scc_state_wr_39[] = { {0} }; |
||||
static struct scc_dma_state scc_state_rd_40[] = { {-1} }; |
||||
static struct scc_dma_state scc_state_wr_40[] = { {-1} }; |
||||
|
||||
/* DMA state references to access from the driver */ |
||||
static struct scc_dma_state *scc_state_rd[] = { |
||||
scc_state_rd_0, |
||||
scc_state_rd_1, |
||||
scc_state_rd_2, |
||||
scc_state_rd_3, |
||||
scc_state_rd_4, |
||||
scc_state_rd_5, |
||||
scc_state_rd_6, |
||||
scc_state_rd_7, |
||||
scc_state_rd_8, |
||||
scc_state_rd_9, |
||||
scc_state_rd_10, |
||||
scc_state_rd_11, |
||||
scc_state_rd_12, |
||||
scc_state_rd_13, |
||||
scc_state_rd_14, |
||||
scc_state_rd_15, |
||||
scc_state_rd_16, |
||||
scc_state_rd_17, |
||||
scc_state_rd_18, |
||||
scc_state_rd_19, |
||||
scc_state_rd_20, |
||||
scc_state_rd_21, |
||||
scc_state_rd_22, |
||||
scc_state_rd_23, |
||||
scc_state_rd_24, |
||||
scc_state_rd_25, |
||||
scc_state_rd_26, |
||||
scc_state_rd_27, |
||||
scc_state_rd_28, |
||||
scc_state_rd_29, |
||||
scc_state_rd_30, |
||||
scc_state_rd_31, |
||||
scc_state_rd_32, |
||||
scc_state_rd_33, |
||||
scc_state_rd_34, |
||||
scc_state_rd_35, |
||||
scc_state_rd_36, |
||||
scc_state_rd_37, |
||||
scc_state_rd_38, |
||||
scc_state_rd_39, |
||||
scc_state_rd_40, |
||||
}; |
||||
|
||||
static struct scc_dma_state *scc_state_wr[] = { |
||||
scc_state_wr_0, |
||||
scc_state_wr_1, |
||||
scc_state_wr_2, |
||||
scc_state_wr_3, |
||||
scc_state_wr_4, |
||||
scc_state_wr_5, |
||||
scc_state_wr_6, |
||||
scc_state_wr_7, |
||||
scc_state_wr_8, |
||||
scc_state_wr_9, |
||||
scc_state_wr_10, |
||||
scc_state_wr_11, |
||||
scc_state_wr_12, |
||||
scc_state_wr_13, |
||||
scc_state_wr_14, |
||||
scc_state_wr_15, |
||||
scc_state_wr_16, |
||||
scc_state_wr_17, |
||||
scc_state_wr_18, |
||||
scc_state_wr_19, |
||||
scc_state_wr_20, |
||||
scc_state_wr_21, |
||||
scc_state_wr_22, |
||||
scc_state_wr_23, |
||||
scc_state_wr_24, |
||||
scc_state_wr_25, |
||||
scc_state_wr_26, |
||||
scc_state_wr_27, |
||||
scc_state_wr_28, |
||||
scc_state_wr_29, |
||||
scc_state_wr_30, |
||||
scc_state_wr_31, |
||||
scc_state_wr_32, |
||||
scc_state_wr_33, |
||||
scc_state_wr_34, |
||||
scc_state_wr_35, |
||||
scc_state_wr_36, |
||||
scc_state_wr_37, |
||||
scc_state_wr_38, |
||||
scc_state_wr_39, |
||||
scc_state_wr_40, |
||||
}; |
||||
|
||||
static u32 scc_takeover_mode = SCC_TO_IMMEDIATE; |
||||
|
||||
/* Change mode of the SPDMA for given direction */ |
||||
static u32 scc_agu_mode_sp = AGU_BYPASS; |
||||
|
||||
/* Change mode of the USB for given direction */ |
||||
static u32 scc_agu_mode_usb = AGU_BYPASS; |
||||
|
||||
static union scc_softwareconfiguration scc_software_configuration[SCC_MAX]; |
||||
|
||||
static u32 dma_fsm[4][4] = { |
||||
/* DMA_CMD_RESET DMA_CMD_SETUP DMA_CMD_START DMA_CMD_STOP */ |
||||
/* DMA_STATE_RESET */ |
||||
{DMA_STATE_RESET, DMA_STATE_SETUP, DMA_STATE_ERROR, DMA_STATE_ERROR}, |
||||
/* DMA_STATE_SETUP */ |
||||
{DMA_STATE_RESET, DMA_STATE_SETUP, DMA_STATE_START, DMA_STATE_SETUP}, |
||||
/* DMA_STATE_START */ |
||||
{DMA_STATE_RESET, DMA_STATE_ERROR, DMA_STATE_START, DMA_STATE_SETUP}, |
||||
/* DMA_STATE_ERROR */ |
||||
{DMA_STATE_RESET, DMA_STATE_ERROR, DMA_STATE_ERROR, DMA_STATE_ERROR}, |
||||
}; |
||||
|
||||
static void dma_state_process(struct scc_dma_state *dma_state, u32 cmd) |
||||
{ |
||||
dma_state->dma_status = dma_fsm[dma_state->dma_status][cmd]; |
||||
dma_state->dma_cmd = cmd; |
||||
} |
||||
|
||||
static void dma_state_process_dma_command(struct scc_dma_state *dma_state, |
||||
u32 dma_cmd) |
||||
{ |
||||
dma_state->dma_cmd = dma_cmd; |
||||
switch (dma_cmd) { |
||||
case DMA_START: |
||||
case DMA_START_FH_RESET: |
||||
dma_state_process(dma_state, DMA_CMD_START); |
||||
break; |
||||
case DMA_STOP: |
||||
dma_state_process(dma_state, DMA_CMD_STOP); |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
static void scc_takeover_dma(enum scc_id id, u32 dma_id, u32 drs) |
||||
{ |
||||
union scc_cmd dma_cmd; |
||||
|
||||
dma_cmd.reg = 0; |
||||
|
||||
/* Prepare the takeover for the DMA channel */ |
||||
dma_cmd.bits.action = DMA_TAKEOVER; |
||||
dma_cmd.bits.id = dma_id; |
||||
dma_cmd.bits.rid = TO_DMA_CFG; /* this is DMA_CFG register takeover */ |
||||
if (drs == DMA_WRITE) |
||||
dma_cmd.bits.drs = DMA_WRITE; |
||||
|
||||
reg_write(SCC_CMD(scc_descriptor_table[id].base_address), dma_cmd.reg); |
||||
} |
||||
|
||||
int scc_dma_cmd(enum scc_id id, u32 cmd, u32 dma_id, u32 drs) |
||||
{ |
||||
union scc_cmd dma_cmd; |
||||
struct scc_dma_state *dma_state; |
||||
|
||||
if ((id >= SCC_MAX) || (id < 0)) |
||||
return -EINVAL; |
||||
|
||||
dma_cmd.reg = 0; |
||||
|
||||
/* Prepare the takeover for the DMA channel */ |
||||
dma_cmd.bits.action = cmd; |
||||
dma_cmd.bits.id = dma_id; |
||||
if (drs == DMA_WRITE) { |
||||
dma_cmd.bits.drs = DMA_WRITE; |
||||
dma_state = &scc_state_wr[id][dma_id]; |
||||
} else { |
||||
dma_state = &scc_state_rd[id][dma_id]; |
||||
} |
||||
|
||||
dma_state->scc_id = id; |
||||
dma_state->dma_id = dma_id; |
||||
dma_state_process_dma_command(dma_state, cmd); |
||||
|
||||
reg_write(SCC_CMD(scc_descriptor_table[id].base_address), dma_cmd.reg); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int scc_set_usb_address_generation_mode(u32 agu_mode) |
||||
{ |
||||
if (AGU_ACTIVE == agu_mode) { |
||||
/* Ensure both DMAs are stopped */ |
||||
scc_dma_cmd(SCC_USB_RW, DMA_STOP, 0, DMA_WRITE); |
||||
scc_dma_cmd(SCC_USB_RW, DMA_STOP, 0, DMA_READ); |
||||
} else { |
||||
agu_mode = AGU_BYPASS; |
||||
} |
||||
|
||||
scc_agu_mode_usb = agu_mode; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int scc_setup_dma(enum scc_id id, u32 buffer_tag, |
||||
u32 type, u32 fh_mode, u32 drs, u32 dma_id) |
||||
{ |
||||
struct scc_dma_state *dma_state; |
||||
int return_value = 0; |
||||
union scc_dma_cfg dma_cfg; |
||||
u32 *buffer_tag_list = scc_descriptor_table[id].buffer_tag_list; |
||||
u32 tag_count, t, t_valid; |
||||
|
||||
if ((id >= SCC_MAX) || (id < 0)) |
||||
return -EINVAL; |
||||
|
||||
/* if the register is only configured by hw, cannot write! */ |
||||
if (1 == scc_descriptor_table[id].hw_dma_cfg) |
||||
return -EACCES; |
||||
|
||||
if (DMA_WRITE == drs) { |
||||
if (dma_id >= scc_descriptor_table[id].p_dma_channels_wr) |
||||
return -EINVAL; |
||||
dma_state = &scc_state_wr[id][dma_id]; |
||||
} else { |
||||
if (dma_id >= scc_descriptor_table[id].p_dma_channels_rd) |
||||
return -EINVAL; |
||||
dma_state = &scc_state_rd[id][dma_id]; |
||||
} |
||||
|
||||
/* Compose the DMA configuration register */ |
||||
tag_count = buffer_tag_list[0]; |
||||
t_valid = 0; |
||||
for (t = 1; t <= tag_count; t++) { |
||||
if (buffer_tag == buffer_tag_list[t]) { |
||||
/* Tag found - validate */ |
||||
t_valid = 1; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if (!t_valid) |
||||
return -EACCES; |
||||
|
||||
/*
|
||||
* Read the register first -- two functions write into the register |
||||
* it does not make sense to read the DMA config back, because there |
||||
* are two register configuration sets (drs) |
||||
*/ |
||||
dma_cfg.reg = 0; |
||||
dma_cfg.bits.buffer_id = buffer_tag; |
||||
dma_state_process(dma_state, DMA_CMD_SETUP); |
||||
|
||||
/*
|
||||
* This is Packet CFG set select - usable for TSIO, EBI and those SCCs |
||||
* which habe 2 packet configs |
||||
*/ |
||||
dma_cfg.bits.packet_cfg_id = |
||||
scc_software_configuration[id].bits.packet_select; |
||||
|
||||
if (type == DMA_CYCLIC) |
||||
dma_cfg.bits.buffer_type = 1; |
||||
else |
||||
dma_cfg.bits.buffer_type = 0; |
||||
|
||||
if (fh_mode == USE_FH) |
||||
dma_cfg.bits.fh_mode = 1; |
||||
else |
||||
dma_cfg.bits.fh_mode = 0; |
||||
|
||||
if (id == SCC_CPU1_SPDMA_RW) |
||||
dma_cfg.bits.agu_mode = scc_agu_mode_sp; |
||||
|
||||
if (id == SCC_USB_RW) |
||||
dma_cfg.bits.agu_mode = scc_agu_mode_usb; |
||||
|
||||
reg_write(SCC_DMA_CFG(scc_descriptor_table[id].base_address), |
||||
dma_cfg.reg); |
||||
|
||||
/* The DMA_CFG needs a takeover! */ |
||||
if (SCC_TO_IMMEDIATE == scc_takeover_mode) |
||||
scc_takeover_dma(id, dma_id, drs); |
||||
|
||||
/* if (buffer_tag is not used) */ |
||||
dma_state->buffer_tag = buffer_tag; |
||||
|
||||
dma_state->scc_id = id; |
||||
dma_state->dma_id = dma_id; |
||||
|
||||
return return_value; |
||||
} |
||||
|
||||
int scc_enable(enum scc_id id, u32 value) |
||||
{ |
||||
if ((id >= SCC_MAX) || (id < 0)) |
||||
return -EINVAL; |
||||
|
||||
if (value == 0) { |
||||
scc_software_configuration[id].bits.enable_status = 0; |
||||
} else { |
||||
value = 1; |
||||
scc_software_configuration[id].bits.enable_status = 1; |
||||
} |
||||
reg_write(SCC_ENABLE(scc_descriptor_table[id].base_address), value); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static inline void ehb(void) |
||||
{ |
||||
__asm__ __volatile__( |
||||
" .set mips32r2 \n" |
||||
" ehb \n" |
||||
" .set mips0 \n"); |
||||
} |
||||
|
||||
int scc_reset(enum scc_id id, u32 value) |
||||
{ |
||||
if ((id >= SCC_MAX) || (id < 0)) |
||||
return -EINVAL; |
||||
|
||||
/* Invert value to the strait logic from the negative hardware logic */ |
||||
if (value == 0) |
||||
value = 1; |
||||
else |
||||
value = 0; |
||||
|
||||
/* Write the value to the register */ |
||||
reg_write(SCC_RESET(scc_descriptor_table[id].base_address), value); |
||||
|
||||
/* sync flush */ |
||||
asm("sync"); /* request bus write queue flush */ |
||||
ehb(); /* wait until previous bus commit instr has finished */ |
||||
asm("nop"); /* wait for flush to occur */ |
||||
asm("nop"); /* wait for flush to occur */ |
||||
|
||||
udelay(100); |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,205 @@ |
||||
/*
|
||||
* (C) Copyright 2009 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* Copyright (C) 2006 Micronas GmbH |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#ifndef _SCC_H |
||||
#define _SCC_H |
||||
|
||||
#define DMA_READ 0 /* SCC read DMA */ |
||||
#define DMA_WRITE 1 /* SCC write DMA */ |
||||
|
||||
#define DMA_LINEAR 0 /* DMA linear buffer access method */ |
||||
#define DMA_CYCLIC 1 /* DMA cyclic buffer access method */ |
||||
|
||||
#define DMA_START 0 /* DMA command - start DMA */ |
||||
#define DMA_STOP 1 /* DMA command - stop DMA */ |
||||
#define DMA_START_FH_RESET 2 /* DMA command - start DMA reset FH */ |
||||
#define DMA_TAKEOVER 15 /* DMA command - commit the DMA conf */ |
||||
|
||||
#define AGU_ACTIVE 0 /* enable AGU address calculation */ |
||||
#define AGU_BYPASS 1 /* set AGU to bypass mode */ |
||||
|
||||
#define USE_NO_FH 0 /* order the DMA to not use FH */ |
||||
#define USE_FH 1 /* order the DMA to work with FH*/ |
||||
|
||||
#define SCC_DBG_IDLE 0 /* DEBUG status (idle interfaces) */ |
||||
#define SCC_DBG_SYNC_RES 0x0001 /* synchronuous reset */ |
||||
|
||||
#define SCC_TO_IMMEDIATE 1 /* takeover command issued immediately*/ |
||||
#define TO_DMA_CFG 2 /* takeover command for the DMA config*/ |
||||
|
||||
#define DMA_CMD_RESET 0 |
||||
#define DMA_CMD_SETUP 1 |
||||
#define DMA_CMD_START 2 |
||||
#define DMA_CMD_STOP 3 |
||||
|
||||
#define DMA_STATE_RESET 0 |
||||
#define DMA_STATE_SETUP 1 |
||||
#define DMA_STATE_START 2 |
||||
#define DMA_STATE_ERROR 3 |
||||
|
||||
#define SRMD 0 |
||||
#define STRM_D 1 |
||||
#define STRM_P 2 |
||||
|
||||
/*
|
||||
* Slowest Monterey domain is DVP 27 MHz (324/27 = 12; 12*16 = 192 CPU clocks) |
||||
*/ |
||||
#define RESET_TIME 2 /* cycle calc see in SCC_Reset */ |
||||
|
||||
struct scc_descriptor { |
||||
char *pu_name; /* PU identifier */ |
||||
char *scc_instance; /* SCC Name */ |
||||
u32 profile; /* SCC VCI_D profile */ |
||||
|
||||
u32 base_address; /* base address of the SCC unit reg shell*/ |
||||
|
||||
/* SCS Interconnect configuration */ |
||||
u32 p_scc_id; /* instance number of SCC unit */ |
||||
u32 p_mci_id; /* memory channel ID */ |
||||
|
||||
/* DMA Registers configuration */ |
||||
u32 p_dma_channels_rd; /* Number of Read DMA channels */ |
||||
u32 p_dma_channels_wr; /* Number of Write DMA channels */ |
||||
|
||||
u32 p_dma_packet_desc; /* Number of packet descriptors */ |
||||
u32 p_dma_mci_desc; /* Number of MCI_CFG Descriptors */ |
||||
|
||||
int use_fh; /* the flag tells if SCC uses an FH */ |
||||
|
||||
int p_si2ocp_id; /* instance number of SI2OCP unit */ |
||||
int hw_dma_cfg; /* HW or SW DMA config flag */ |
||||
int hw_dma_start; /* HW or SW DMA start/stop flag */ |
||||
|
||||
u32 *buffer_tag_list; /* list of the buffer tags available */ |
||||
u32 *csize_list; /* list of the valid CSIZE values */ |
||||
}; |
||||
|
||||
struct scc_dma_state { |
||||
u32 scc_id:8; /* SCC id */ |
||||
u32 dma_id:8; /* DMA id, used for match with array idx*/ |
||||
u32 buffer_tag:8; /* mem buf tag, assigned to this DMA */ |
||||
u32 dma_status:2; /* state of DMA, of the DMA_STATE_ const*/ |
||||
u32 dma_drs:2; /* DMA dir, either DMA_READ or DMA_WRITE*/ |
||||
u32 dma_cmd:4; /* last executed command on this DMA */ |
||||
}; |
||||
|
||||
union scc_cmd { |
||||
u32 reg; |
||||
struct { |
||||
u32 res1:19; /* reserved */ |
||||
u32 drs:1; /* DMA Register Set */ |
||||
u32 rid:2; /* Register Identifier */ |
||||
u32 id:6; /* DMA Identifier */ |
||||
u32 action:4; /* DMA Command encoding */ |
||||
} bits; |
||||
}; |
||||
|
||||
union scc_dma_cfg { |
||||
u32 reg; |
||||
struct { |
||||
u32 res1:17; /* reserved */ |
||||
u32 agu_mode:1; /* AGU Mode */ |
||||
u32 res2:1; /* reserved */ |
||||
u32 fh_mode:1; /* Fifo Handler */ |
||||
u32 buffer_type:1; /* Defines type of mem buffers */ |
||||
u32 mci_cfg_id:1; /* MCI_CFG register selector */ |
||||
u32 packet_cfg_id:1; /* PACKET_CFG register selector */ |
||||
u32 buffer_id:8; /* DMA Buffer Identifier */ |
||||
} bits; |
||||
}; |
||||
|
||||
union scc_debug { |
||||
u32 reg; |
||||
struct { |
||||
u32 res1:20; /* reserved */ |
||||
u32 arg:8; /* SCC Debug Command Argument (#) */ |
||||
u32 cmd:4; /* SCC Debug Command Register */ |
||||
} bits; |
||||
}; |
||||
|
||||
union scc_softwareconfiguration { |
||||
u32 reg; |
||||
struct { |
||||
u32 res1:28; /* reserved */ |
||||
u32 clock_status:1; /* clock on/off */ |
||||
u32 packet_select:1; /* active SCC packet id */ |
||||
u32 enable_status:1; /* enabled [1/0] */ |
||||
u32 active_status:1; /* 1=active 0=reset */ |
||||
} bits; |
||||
}; |
||||
|
||||
/*
|
||||
* System on Chip Channel ID |
||||
*/ |
||||
enum scc_id { |
||||
SCC_NULL = -1, /* illegal SCC identifier */ |
||||
SCC_FE_3DCOMB_WR, /* SCC_FE_3DCOMB Write channel */ |
||||
SCC_FE_3DCOMB_RD, /* SCC_FE_3DCOMB Read channel */ |
||||
SCC_DI_TNR_WR, /* SCC_DI_TNR Write channel */ |
||||
SCC_DI_TNR_FIELD_RD, /* SCC_DI_TNR_FIELD Read channel */ |
||||
SCC_DI_TNR_FRAME_RD, /* SCC_DI_TNR_FRAME Read channel */ |
||||
SCC_DI_MVAL_WR, /* SCC_DI_MVAL Write channel */ |
||||
SCC_DI_MVAL_RD, /* SCC_DI_MVAL Read channel */ |
||||
SCC_RC_FRAME_WR, /* SCC_RC_FRAME Write channel */ |
||||
SCC_RC_FRAME0_RD, /* SCC_RC_FRAME0 Read channel */ |
||||
SCC_OPT_FIELD0_RD, /* SCC_OPT_FIELD0 Read channel */ |
||||
SCC_OPT_FIELD1_RD, /* SCC_OPT_FIELD1 Read channel */ |
||||
SCC_OPT_FIELD2_RD, /* SCC_OPT_FIELD2 Read channel */ |
||||
SCC_PIP_FRAME_WR, /* SCC_PIP_FRAME Write channel */ |
||||
SCC_PIP_FRAME_RD, /* SCC_PIP_FRAME Read channel */ |
||||
SCC_DP_AGPU_RD, /* SCC_DP_AGPU Read channel */ |
||||
SCC_EWARP_RW, /* SCC_EWARP Read/Write channel */ |
||||
SCC_DP_OSD_RD, /* SCC_DP_OSD Read channel */ |
||||
SCC_DP_GRAPHIC_RD, /* SCC_DP_GRAPHIC Read channel */ |
||||
SCC_DVP_OSD_RD, /* SCC_DVP_OSD Read channel */ |
||||
SCC_DVP_VBI_RD, /* SCC_DVP_VBI Read channel */ |
||||
SCC_TSIO_WR, /* SCC_TSIO Write channel */ |
||||
SCC_TSIO_RD, /* SCC_TSIO Read channel */ |
||||
SCC_TSD_WR, /* SCC_TSD Write channel */ |
||||
SCC_VD_UD_ST_RW, /* SCC_VD_UD_ST Read/Write channel */ |
||||
SCC_VD_FRR_RD, /* SCC_VD_FRR Read channel */ |
||||
SCC_VD_FRW_DISP_WR, /* SCC_VD_FRW_DISP Write channel */ |
||||
SCC_MR_VD_M_Y_RD, /* SCC_MR_VD_M_Y Read channel */ |
||||
SCC_MR_VD_M_C_RD, /* SCC_MR_VD_M_C Read channel */ |
||||
SCC_MR_VD_S_Y_RD, /* SCC_MR_VD_S_Y Read channel */ |
||||
SCC_MR_VD_S_C_RD, /* SCC_MR_VD_S_C Read channel */ |
||||
SCC_GA_WR, /* SCC_GA Write channel */ |
||||
SCC_GA_SRC1_RD, /* SCC_GA_SRC1 Read channel */ |
||||
SCC_GA_SRC2_RD, /* SCC_GA_SRC2 Read channel */ |
||||
SCC_AD_RD, /* SCC_AD Read channel */ |
||||
SCC_AD_WR, /* SCC_AD Write channel */ |
||||
SCC_ABP_RD, /* SCC_ABP Read channel */ |
||||
SCC_ABP_WR, /* SCC_ABP Write channel */ |
||||
SCC_EBI_RW, /* SCC_EBI Read/Write channel */ |
||||
SCC_USB_RW, /* SCC_USB Read/Write channel */ |
||||
SCC_CPU1_SPDMA_RW, /* SCC_CPU1_SPDMA Read/Write channel */ |
||||
SCC_CPU1_BRIDGE_RW, /* SCC_CPU1_BRIDGE Read/Write channel */ |
||||
SCC_MAX /* maximum limit on the SCC id */ |
||||
}; |
||||
|
||||
int scc_set_usb_address_generation_mode(u32 agu_mode); |
||||
int scc_dma_cmd(enum scc_id id, u32 cmd, u32 dma_id, u32 drs); |
||||
int scc_setup_dma(enum scc_id id, u32 buffer_tag, |
||||
u32 type, u32 fh_mode, u32 drs, u32 dma_id); |
||||
int scc_enable(enum scc_id id, u32 value); |
||||
int scc_reset(enum scc_id id, u32 value); |
||||
|
||||
#endif /* _SCC_H */ |
@ -0,0 +1,394 @@ |
||||
/*
|
||||
* (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* Copyright 2005, Seagate Technology LLC |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License version 2 as |
||||
* published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
*/ |
||||
|
||||
#undef DEBUG |
||||
|
||||
#include <common.h> |
||||
#include <command.h> |
||||
#include <config.h> |
||||
#include <net.h> |
||||
|
||||
#include "vct.h" |
||||
|
||||
#define SMSC9118_BASE CONFIG_DRIVER_SMC911X_BASE |
||||
#define BYTE_TEST (SMSC9118_BASE + 0x64) |
||||
#define GPIO_CFG (SMSC9118_BASE + 0x88) |
||||
#define MAC_CSR_CMD (SMSC9118_BASE + 0xA4) |
||||
#define MAC_CSR_CMD_CSR_BUSY (0x80000000) |
||||
#define MAC_CSR_CMD_RNW (0x40000000) |
||||
#define MAC_RD_CMD(reg) ((reg & 0x000000FF) | \ |
||||
(MAC_CSR_CMD_CSR_BUSY | MAC_CSR_CMD_RNW)) |
||||
#define MAC_WR_CMD(reg) ((reg & 0x000000FF) | \ |
||||
(MAC_CSR_CMD_CSR_BUSY)) |
||||
#define MAC_CSR_DATA (SMSC9118_BASE + 0xA8) |
||||
#define E2P_CMD (SMSC9118_BASE + 0xB0) |
||||
#define E2P_CMD_EPC_BUSY_ (0x80000000UL) /* Self Clearing */ |
||||
#define E2P_CMD_EPC_CMD_ (0x70000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_CMD_READ_ (0x00000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_CMD_EWDS_ (0x10000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_CMD_EWEN_ (0x20000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_CMD_WRITE_ (0x30000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_CMD_WRAL_ (0x40000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_CMD_ERASE_ (0x50000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_CMD_ERAL_ (0x60000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_CMD_RELOAD_ (0x70000000UL) /* R/W */ |
||||
#define E2P_CMD_EPC_TIMEOUT_ (0x00000200UL) /* R */ |
||||
#define E2P_CMD_MAC_ADDR_LOADED_ (0x00000100UL) /* RO */ |
||||
#define E2P_CMD_EPC_ADDR_ (0x000000FFUL) /* R/W */ |
||||
#define E2P_DATA (SMSC9118_BASE + 0xB4) |
||||
|
||||
#define MAC_ADDRH (0x2) |
||||
#define MAC_ADDRL (0x3) |
||||
|
||||
#define MAC_TIMEOUT 200 |
||||
|
||||
#define HIBYTE(word) ((u8)(((u16)(word)) >> 8)) |
||||
#define LOBYTE(word) ((u8)(((u16)(word)) & 0x00FFU)) |
||||
#define HIWORD(dword) ((u16)(((u32)(dword)) >> 16)) |
||||
#define LOWORD(dword) ((u16)(((u32)(dword)) & 0x0000FFFFUL)) |
||||
|
||||
static int mac_busy(int req_to) |
||||
{ |
||||
int timeout = req_to; |
||||
|
||||
while (timeout--) { |
||||
if (!(smc911x_reg_read(MAC_CSR_CMD) & MAC_CSR_CMD_CSR_BUSY)) |
||||
goto done; |
||||
} |
||||
return 1; /* Timeout */ |
||||
|
||||
done: |
||||
return 0; /* No timeout */ |
||||
} |
||||
|
||||
static ulong get_mac_reg(int reg) |
||||
{ |
||||
ulong reg_val = 0xffffffff; |
||||
|
||||
if (smc911x_reg_read(MAC_CSR_CMD) & MAC_CSR_CMD_CSR_BUSY) { |
||||
printf("get_mac_reg: previous command not complete\n"); |
||||
goto done; |
||||
} |
||||
|
||||
smc911x_reg_write(MAC_CSR_CMD, MAC_RD_CMD(reg)); |
||||
udelay(10000); |
||||
|
||||
if (mac_busy(MAC_TIMEOUT) == 1) { |
||||
printf("get_mac_reg: timeout waiting for response from MAC\n"); |
||||
goto done; |
||||
} |
||||
|
||||
reg_val = smc911x_reg_read(MAC_CSR_DATA); |
||||
|
||||
done: |
||||
return (reg_val); |
||||
} |
||||
|
||||
static ulong eeprom_enable_access(void) |
||||
{ |
||||
ulong gpio; |
||||
|
||||
gpio = smc911x_reg_read(GPIO_CFG); |
||||
debug("%s: gpio= 0x%08lx ---> 0x%08lx\n", __func__, gpio, |
||||
(gpio & 0xFF0FFFFFUL)); |
||||
|
||||
smc911x_reg_write(GPIO_CFG, (gpio & 0xFF0FFFFFUL)); |
||||
return gpio; |
||||
} |
||||
|
||||
static void eeprom_disable_access(ulong gpio) |
||||
{ |
||||
debug("%s: gpio= 0x%08lx\n", __func__, gpio); |
||||
smc911x_reg_write(GPIO_CFG, gpio); |
||||
} |
||||
|
||||
static int eeprom_is_mac_address_loaded(void) |
||||
{ |
||||
int ret; |
||||
|
||||
ret = smc911x_reg_read(MAC_CSR_CMD) & E2P_CMD_MAC_ADDR_LOADED_; |
||||
debug("%s: ret = %x\n", __func__, ret); |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
static int eeprom_read_location(unchar address, u8 *data) |
||||
{ |
||||
ulong timeout = 100000; |
||||
ulong temp = 0; |
||||
|
||||
if ((temp = smc911x_reg_read(E2P_CMD)) & E2P_CMD_EPC_BUSY_) { |
||||
printf("%s: Busy at start, E2P_CMD=0x%08lX\n", __func__, temp); |
||||
return 0; |
||||
} |
||||
|
||||
smc911x_reg_write(E2P_CMD, |
||||
(E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_READ_ | |
||||
((ulong) address))); |
||||
|
||||
while ((timeout > 0) && (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_)) { |
||||
udelay(10); |
||||
timeout--; |
||||
} |
||||
|
||||
if (timeout == 0) { |
||||
printf("Timeout\n"); |
||||
return 0; |
||||
} |
||||
(*data) = (unchar) (smc911x_reg_read(E2P_DATA)); |
||||
debug("%s: ret = %x\n", __func__, (*data)); |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
static int eeprom_enable_erase_and_write(void) |
||||
{ |
||||
ulong timeout = 100000; |
||||
|
||||
if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_) { |
||||
printf("%s: Busy at start\n", __func__); |
||||
return 0; |
||||
} |
||||
smc911x_reg_write(E2P_CMD, (E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_EWEN_)); |
||||
|
||||
while ((timeout > 0) && (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_)) { |
||||
udelay(10); |
||||
timeout--; |
||||
} |
||||
|
||||
if (timeout == 0) { |
||||
printf("Timeout[1]\n"); |
||||
return 0; |
||||
} |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
static int eeprom_disable_erase_and_write(void) |
||||
{ |
||||
ulong timeout = 100000; |
||||
|
||||
if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_) { |
||||
printf("%s: Busy at start\n", __func__); |
||||
return 0; |
||||
} |
||||
smc911x_reg_write(E2P_CMD, (E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_EWDS_)); |
||||
|
||||
while ((timeout > 0) && (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_)) { |
||||
udelay(10); |
||||
timeout--; |
||||
} |
||||
|
||||
if (timeout == 0) { |
||||
printf("Timeout[2]\n"); |
||||
return 0; |
||||
} |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
static int eeprom_write_location(unchar address, unchar data) |
||||
{ |
||||
ulong timeout = 100000; |
||||
|
||||
debug("%s: address: %x data = %x\n", __func__, address, data); |
||||
|
||||
if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_) { |
||||
printf("%s: Busy at start\n", __func__); |
||||
return 0; |
||||
} |
||||
|
||||
smc911x_reg_write(E2P_DATA, ((ulong) data)); |
||||
smc911x_reg_write(E2P_CMD, |
||||
(E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_WRITE_ | |
||||
((ulong) address))); |
||||
|
||||
while ((timeout > 0) && (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_)) { |
||||
udelay(10); |
||||
timeout--; |
||||
} |
||||
|
||||
if (timeout == 0) { |
||||
printf("Timeout[3]\n"); |
||||
return 0; |
||||
} |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
static int eeprom_erase_all(void) |
||||
{ |
||||
ulong timeout = 100000; |
||||
|
||||
if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_) { |
||||
printf("%s: Busy at start\n", __func__); |
||||
return 0; |
||||
} |
||||
|
||||
smc911x_reg_write(E2P_CMD, (E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_ERAL_)); |
||||
|
||||
while ((timeout > 0) && (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_)) { |
||||
udelay(10); |
||||
timeout--; |
||||
} |
||||
|
||||
if (timeout == 0) { |
||||
printf("Timeout[4]\n"); |
||||
return 0; |
||||
} |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
static int eeprom_reload(void) |
||||
{ |
||||
ulong timeout = 100000; |
||||
|
||||
if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_) { |
||||
printf("%s: Busy at start\n", __func__); |
||||
return -1; |
||||
} |
||||
smc911x_reg_write(E2P_CMD, |
||||
(E2P_CMD_EPC_BUSY_ | E2P_CMD_EPC_CMD_RELOAD_)); |
||||
|
||||
while ((timeout > 0) && (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY_)) { |
||||
udelay(10); |
||||
timeout--; |
||||
} |
||||
|
||||
if (timeout == 0) |
||||
return 0; |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
static int eeprom_save_mac_address(ulong dwHi16, ulong dwLo32) |
||||
{ |
||||
int result = 0; |
||||
|
||||
debug("%s: dwHI: 0x%08lx dwLO: %08lx, \n", __func__, dwHi16, dwLo32); |
||||
|
||||
if (!eeprom_enable_erase_and_write()) |
||||
goto DONE; |
||||
if (!eeprom_erase_all()) |
||||
goto DONE; |
||||
if (!eeprom_write_location(0, 0xA5)) |
||||
goto DONE; |
||||
if (!eeprom_write_location(1, LOBYTE(LOWORD(dwLo32)))) |
||||
goto DONE; |
||||
if (!eeprom_write_location(2, HIBYTE(LOWORD(dwLo32)))) |
||||
goto DONE; |
||||
if (!eeprom_write_location(3, LOBYTE(HIWORD(dwLo32)))) |
||||
goto DONE; |
||||
if (!eeprom_write_location(4, HIBYTE(HIWORD(dwLo32)))) |
||||
goto DONE; |
||||
if (!eeprom_write_location(5, LOBYTE(LOWORD(dwHi16)))) |
||||
goto DONE; |
||||
if (!eeprom_write_location(6, HIBYTE(LOWORD(dwHi16)))) |
||||
goto DONE; |
||||
if (!eeprom_disable_erase_and_write()) |
||||
goto DONE; |
||||
|
||||
result = 1; |
||||
|
||||
DONE: |
||||
return result; |
||||
} |
||||
|
||||
static int do_eeprom_dump(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
||||
{ |
||||
unchar data = 0, index = 0; |
||||
ulong gpio_old_val; |
||||
|
||||
gpio_old_val = eeprom_enable_access(); |
||||
|
||||
printf("EEPROM content: \n"); |
||||
for (index = 0; index < 8; index++) { |
||||
if (eeprom_read_location(index, &data)) |
||||
printf("%02x ", data); |
||||
else |
||||
printf("FAILED"); |
||||
} |
||||
|
||||
eeprom_disable_access(gpio_old_val); |
||||
printf("\n"); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int do_eeprom_erase_all(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
||||
{ |
||||
eeprom_erase_all(); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int do_eeprom_save_mac(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
||||
{ |
||||
ulong hi16, lo32; |
||||
unchar ethaddr[6], i; |
||||
ulong gpio; |
||||
char *tmp, *end; |
||||
|
||||
tmp = argv[1]; |
||||
for (i = 0; i < 6; i++) { |
||||
ethaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0; |
||||
if (tmp) |
||||
tmp = (*end) ? end + 1 : end; |
||||
} |
||||
|
||||
hi16 = (ethaddr[5] << 8) | (ethaddr[4]); |
||||
lo32 = (ethaddr[3] << 24) | (ethaddr[2] << 16) | |
||||
(ethaddr[1] << 8) | (ethaddr[0]); |
||||
|
||||
gpio = eeprom_enable_access(); |
||||
|
||||
eeprom_save_mac_address(hi16, lo32); |
||||
|
||||
eeprom_reload(); |
||||
|
||||
/* Check new values */ |
||||
if (eeprom_is_mac_address_loaded()) { |
||||
ulong mac_hi16, mac_lo32; |
||||
|
||||
mac_hi16 = get_mac_reg(MAC_ADDRH); |
||||
mac_lo32 = get_mac_reg(MAC_ADDRL); |
||||
printf("New MAC address: %lx, %lx\n", mac_hi16, mac_lo32); |
||||
} else { |
||||
printf("Address is not reloaded \n"); |
||||
} |
||||
eeprom_disable_access(gpio); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
U_BOOT_CMD(smcee, 1, 0, do_eeprom_erase_all, |
||||
"smcee - Erase content of SMC EEPROM\n",); |
||||
|
||||
U_BOOT_CMD(smced, 1, 0, do_eeprom_dump, |
||||
"smced - Dump content of SMC EEPROM\n",); |
||||
|
||||
U_BOOT_CMD(smcew, 2, 0, do_eeprom_save_mac, |
||||
"smcew - Write MAC address to SMC EEPROM\n", |
||||
"aa:bb:cc:dd:ee:ff new mac address\n"); |
@ -0,0 +1,289 @@ |
||||
/*
|
||||
* (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* Copyright (C) 2006 Micronas GmbH |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include "vct.h" |
||||
|
||||
typedef union _TOP_PINMUX_t |
||||
{ |
||||
u32 reg; |
||||
struct { |
||||
u32 res : 24; /* reserved */ |
||||
u32 drive : 2; /* Driver strength */ |
||||
u32 slew : 1; /* Slew rate */ |
||||
u32 strig : 1; /* Schmitt trigger input*/ |
||||
u32 pu_pd : 2; /* Pull up/ pull down */ |
||||
u32 funsel : 2; /* Pin function */ |
||||
} Bits; |
||||
} TOP_PINMUX_t; |
||||
|
||||
#if defined(CONFIG_VCT_PREMIUM) || defined(CONFIG_VCT_PLATINUM) |
||||
|
||||
static TOP_PINMUX_t top_read_pin(int pin) |
||||
{ |
||||
TOP_PINMUX_t reg; |
||||
|
||||
switch (pin) { |
||||
case 2: |
||||
case 3: |
||||
case 6: |
||||
case 9: |
||||
reg.reg = 0xdeadbeef; |
||||
break; |
||||
case 4: |
||||
reg.reg = reg_read(FWSRAM_TOP_SCL_CFG(FWSRAM_BASE)); |
||||
break; |
||||
case 5: |
||||
reg.reg = reg_read(FWSRAM_TOP_SDA_CFG(FWSRAM_BASE)); |
||||
break; |
||||
case 7: |
||||
reg.reg = reg_read(FWSRAM_TOP_TDO_CFG(FWSRAM_BASE)); |
||||
break; |
||||
case 8: |
||||
reg.reg = reg_read(FWSRAM_TOP_GPIO2_0_CFG(FWSRAM_BASE)); |
||||
break; |
||||
case 10: |
||||
case 11: |
||||
case 12: |
||||
case 13: |
||||
case 14: |
||||
case 15: |
||||
case 16: |
||||
reg.reg = reg_read(FWSRAM_BASE + FWSRAM_TOP_GPIO2_1_CFG_OFFS + |
||||
((pin - 10) * 4)); |
||||
break; |
||||
default: |
||||
reg.reg = reg_read(TOP_BASE + (pin * 4)); |
||||
break; |
||||
} |
||||
|
||||
return reg; |
||||
} |
||||
|
||||
static void top_write_pin(int pin, TOP_PINMUX_t reg) |
||||
{ |
||||
|
||||
switch (pin) { |
||||
case 4: |
||||
reg_write(FWSRAM_TOP_SCL_CFG(FWSRAM_BASE), reg.reg); |
||||
break; |
||||
case 5: |
||||
reg_write(FWSRAM_TOP_SDA_CFG(FWSRAM_BASE), reg.reg); |
||||
break; |
||||
case 7: |
||||
reg_write(FWSRAM_TOP_TDO_CFG(FWSRAM_BASE), reg.reg); |
||||
break; |
||||
case 8: |
||||
reg_write(FWSRAM_TOP_GPIO2_0_CFG(FWSRAM_BASE), reg.reg); |
||||
break; |
||||
case 10: |
||||
case 11: |
||||
case 12: |
||||
case 13: |
||||
case 14: |
||||
case 15: |
||||
case 16: |
||||
reg_write(FWSRAM_BASE + FWSRAM_TOP_GPIO2_1_CFG_OFFS + |
||||
((pin - 10) * 4), reg.reg); |
||||
break; |
||||
default: |
||||
reg_write(TOP_BASE + (pin * 4), reg.reg); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
int top_set_pin(int pin, int func) |
||||
{ |
||||
TOP_PINMUX_t reg; |
||||
|
||||
/* check global range */ |
||||
if ((pin < 0) || (pin > 170) || (func < 0) || (func > 3)) |
||||
return -1; /* pin number or function out of valid range */ |
||||
|
||||
/* check undefined values; */ |
||||
if ((pin == 2) || (pin == 3) || (pin == 6) || (pin == 9)) |
||||
return -1; /* pin number out of valid range */ |
||||
|
||||
reg = top_read_pin(pin); |
||||
reg.Bits.funsel = func; |
||||
top_write_pin(pin, reg); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined(CONFIG_VCT_PLATINUMAVC) |
||||
|
||||
int top_set_pin(int pin, int func) |
||||
{ |
||||
TOP_PINMUX_t reg; |
||||
|
||||
/* check global range */ |
||||
if ((pin < 0) || (pin > 158)) |
||||
return -1; /* pin number or function out of valid range */ |
||||
|
||||
reg.reg = reg_read(TOP_BASE + (pin * 4)); |
||||
reg.Bits.funsel = func; |
||||
reg_write(TOP_BASE + (pin * 4), reg.reg); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
#endif |
||||
|
||||
void vct_pin_mux_initialize(void) |
||||
{ |
||||
#if defined(CONFIG_VCT_PREMIUM) || defined(CONFIG_VCT_PLATINUM) |
||||
top_set_pin(34, 01); /* EBI_CS0 */ |
||||
top_set_pin(33, 01); /* EBI_CS1 */ |
||||
top_set_pin(32, 01); /* EBI_CS2 */ |
||||
top_set_pin(100, 02); /* EBI_CS3 */ |
||||
top_set_pin(101, 02); /* EBI_CS4 */ |
||||
top_set_pin(102, 02); /* EBI_CS5 */ |
||||
top_set_pin(103, 02); /* EBI_CS6 */ |
||||
top_set_pin(104, 02); /* EBI_CS7 top_set_pin(104,03); EBI_GENIO3 */ |
||||
top_set_pin(35, 01); /* EBI_ALE */ |
||||
top_set_pin(36, 01); /* EBI_ADDR15 */ |
||||
top_set_pin(37, 01); /* EBI_ADDR14 top_set_pin(78,03); EBI_ADDR14 */ |
||||
top_set_pin(38, 01); /* EBI_ADDR13 */ |
||||
top_set_pin(39, 01); /* EBI_ADDR12 */ |
||||
top_set_pin(40, 01); /* EBI_ADDR11 */ |
||||
top_set_pin(41, 01); /* EBI_ADDR10 */ |
||||
top_set_pin(42, 01); /* EBI_ADDR9 */ |
||||
top_set_pin(43, 01); /* EBI_ADDR8 */ |
||||
top_set_pin(44, 01); /* EBI_ADDR7 */ |
||||
top_set_pin(45, 01); /* EBI_ADDR6 */ |
||||
top_set_pin(46, 01); /* EBI_ADDR5 */ |
||||
top_set_pin(47, 01); /* EBI_ADDR4 */ |
||||
top_set_pin(48, 01); /* EBI_ADDR3 */ |
||||
top_set_pin(49, 01); /* EBI_ADDR2 */ |
||||
top_set_pin(50, 01); /* EBI_ADDR1 */ |
||||
top_set_pin(51, 01); /* EBI_ADDR0 */ |
||||
top_set_pin(52, 01); /* EBI_DIR */ |
||||
top_set_pin(53, 01); /* EBI_DAT15 top_set_pin(81,01); EBI_DAT15 */ |
||||
top_set_pin(54, 01); /* EBI_DAT14 top_set_pin(82,01); EBI_DAT14 */ |
||||
top_set_pin(55, 01); /* EBI_DAT13 top_set_pin(83,01); EBI_DAT13 */ |
||||
top_set_pin(56, 01); /* EBI_DAT12 top_set_pin(84,01); EBI_DAT12 */ |
||||
top_set_pin(57, 01); /* EBI_DAT11 top_set_pin(85,01); EBI_DAT11 */ |
||||
top_set_pin(58, 01); /* EBI_DAT10 top_set_pin(86,01); EBI_DAT10 */ |
||||
top_set_pin(59, 01); /* EBI_DAT9 top_set_pin(87,01); EBI_DAT9 */ |
||||
top_set_pin(60, 01); /* EBI_DAT8 top_set_pin(88,01); EBI_DAT8 */ |
||||
top_set_pin(61, 01); /* EBI_DAT7 */ |
||||
top_set_pin(62, 01); /* EBI_DAT6 */ |
||||
top_set_pin(63, 01); /* EBI_DAT5 */ |
||||
top_set_pin(64, 01); /* EBI_DAT4 */ |
||||
top_set_pin(65, 01); /* EBI_DAT3 */ |
||||
top_set_pin(66, 01); /* EBI_DAT2 */ |
||||
top_set_pin(67, 01); /* EBI_DAT1 */ |
||||
top_set_pin(68, 01); /* EBI_DAT0 */ |
||||
top_set_pin(69, 01); /* EBI_IORD */ |
||||
top_set_pin(70, 01); /* EBI_IOWR */ |
||||
top_set_pin(71, 01); /* EBI_WE */ |
||||
top_set_pin(72, 01); /* EBI_OE */ |
||||
top_set_pin(73, 01); /* EBI_IORDY */ |
||||
top_set_pin(95, 02); /* EBI_EBI_DMACK*/ |
||||
top_set_pin(112, 02); /* EBI_IRQ0 */ |
||||
top_set_pin(111, 02); /* EBI_IRQ1 top_set_pin(111,03); EBI_DMARQ */ |
||||
top_set_pin(107, 02); /* EBI_IRQ2 */ |
||||
top_set_pin(108, 02); /* EBI_IRQ3 */ |
||||
top_set_pin(30, 01); /* EBI_GENIO1 top_set_pin(99,03); EBI_GENIO1 */ |
||||
top_set_pin(31, 01); /* EBI_GENIO2 top_set_pin(98,03); EBI_GENIO2 */ |
||||
top_set_pin(105, 02); /* EBI_GENIO3 top_set_pin(104,03); EBI_GENIO3 */ |
||||
top_set_pin(106, 02); /* EBI_GENIO4 top_set_pin(144,02); EBI_GENIO4 */ |
||||
top_set_pin(109, 02); /* EBI_GENIO5 top_set_pin(142,02); EBI_GENIO5 */ |
||||
top_set_pin(110, 02); /* EBI_BURST_CLK */ |
||||
#endif |
||||
|
||||
#if defined(CONFIG_VCT_PLATINUMAVC) |
||||
top_set_pin(19, 01); /* EBI_CS0 */ |
||||
top_set_pin(18, 01); /* EBI_CS1 */ |
||||
top_set_pin(17, 01); /* EBI_CS2 */ |
||||
top_set_pin(92, 02); /* EBI_CS3 */ |
||||
top_set_pin(93, 02); /* EBI_CS4 */ |
||||
top_set_pin(95, 02); /* EBI_CS6 */ |
||||
top_set_pin(96, 02); /* EBI_CS7 top_set_pin(104,03); EBI_GENIO3 */ |
||||
top_set_pin(20, 01); /* EBI_ALE */ |
||||
top_set_pin(21, 01); /* EBI_ADDR15 */ |
||||
top_set_pin(22, 01); /* EBI_ADDR14 top_set_pin(78,03); EBI_ADDR14 */ |
||||
top_set_pin(23, 01); /* EBI_ADDR13 */ |
||||
top_set_pin(24, 01); /* EBI_ADDR12 */ |
||||
top_set_pin(25, 01); /* EBI_ADDR11 */ |
||||
top_set_pin(26, 01); /* EBI_ADDR10 */ |
||||
top_set_pin(27, 01); /* EBI_ADDR9 */ |
||||
top_set_pin(28, 01); /* EBI_ADDR8 */ |
||||
top_set_pin(29, 01); /* EBI_ADDR7 */ |
||||
top_set_pin(30, 01); /* EBI_ADDR6 */ |
||||
top_set_pin(31, 01); /* EBI_ADDR5 */ |
||||
top_set_pin(32, 01); /* EBI_ADDR4 */ |
||||
top_set_pin(33, 01); /* EBI_ADDR3 */ |
||||
top_set_pin(34, 01); /* EBI_ADDR2 */ |
||||
top_set_pin(35, 01); /* EBI_ADDR1 */ |
||||
top_set_pin(36, 01); /* EBI_ADDR0 */ |
||||
top_set_pin(37, 01); /* EBI_DIR */ |
||||
top_set_pin(38, 01); /* EBI_DAT15 top_set_pin(81,01); EBI_DAT15 */ |
||||
top_set_pin(39, 01); /* EBI_DAT14 top_set_pin(82,01); EBI_DAT14 */ |
||||
top_set_pin(40, 01); /* EBI_DAT13 top_set_pin(83,01); EBI_DAT13 */ |
||||
top_set_pin(41, 01); /* EBI_DAT12 top_set_pin(84,01); EBI_DAT12 */ |
||||
top_set_pin(42, 01); /* EBI_DAT11 top_set_pin(85,01); EBI_DAT11 */ |
||||
top_set_pin(43, 01); /* EBI_DAT10 top_set_pin(86,01); EBI_DAT10 */ |
||||
top_set_pin(44, 01); /* EBI_DAT9 top_set_pin(87,01); EBI_DAT9 */ |
||||
top_set_pin(45, 01); /* EBI_DAT8 top_set_pin(88,01); EBI_DAT8 */ |
||||
top_set_pin(46, 01); /* EBI_DAT7 */ |
||||
top_set_pin(47, 01); /* EBI_DAT6 */ |
||||
top_set_pin(48, 01); /* EBI_DAT5 */ |
||||
top_set_pin(49, 01); /* EBI_DAT4 */ |
||||
top_set_pin(50, 01); /* EBI_DAT3 */ |
||||
top_set_pin(51, 01); /* EBI_DAT2 */ |
||||
top_set_pin(52, 01); /* EBI_DAT1 */ |
||||
top_set_pin(53, 01); /* EBI_DAT0 */ |
||||
top_set_pin(54, 01); /* EBI_IORD */ |
||||
top_set_pin(55, 01); /* EBI_IOWR */ |
||||
top_set_pin(56, 01); /* EBI_WE */ |
||||
top_set_pin(57, 01); /* EBI_OE */ |
||||
top_set_pin(58, 01); /* EBI_IORDY */ |
||||
top_set_pin(87, 02); /* EBI_EBI_DMACK*/ |
||||
top_set_pin(106, 02); /* EBI_IRQ0 */ |
||||
top_set_pin(105, 02); /* EBI_IRQ1 top_set_pin(111,03); EBI_DMARQ */ |
||||
top_set_pin(101, 02); /* EBI_IRQ2 */ |
||||
top_set_pin(102, 02); /* EBI_IRQ3 */ |
||||
top_set_pin(15, 01); /* EBI_GENIO1 top_set_pin(99,03); EBI_GENIO1 */ |
||||
top_set_pin(16, 01); /* EBI_GENIO2 top_set_pin(98,03); EBI_GENIO2 */ |
||||
top_set_pin(99, 02); /* EBI_GENIO3 top_set_pin(104,03); EBI_GENIO3 */ |
||||
top_set_pin(100, 02); /* EBI_GENIO4 top_set_pin(144,02); EBI_GENIO4 */ |
||||
top_set_pin(103, 02); /* EBI_GENIO5 top_set_pin(142,02); EBI_GENIO5 */ |
||||
top_set_pin(104, 02); /* EBI_BURST_CLK */ |
||||
#endif |
||||
|
||||
/* I2C: Configure I2C-2 as GPIO to enable soft-i2c */ |
||||
top_set_pin(0, 2); /* SCL2 on GPIO 11 */ |
||||
top_set_pin(1, 2); /* SDA2 on GPIO 10 */ |
||||
|
||||
/* UART pins */ |
||||
#if defined(CONFIG_VCT_PREMIUM) || defined(CONFIG_VCT_PLATINUM) |
||||
top_set_pin(141, 1); |
||||
top_set_pin(143, 1); |
||||
#endif |
||||
#if defined(CONFIG_VCT_PLATINUMAVC) |
||||
top_set_pin(107, 1); |
||||
top_set_pin(109, 1); |
||||
#endif |
||||
} |
@ -0,0 +1,71 @@ |
||||
/* |
||||
* (C) Copyright 2003 |
||||
* Wolfgang Denk Engineering, <wd@denx.de> |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips") |
||||
OUTPUT_ARCH(mips) |
||||
ENTRY(_start) |
||||
SECTIONS |
||||
{ |
||||
. = 0x00000000; |
||||
|
||||
. = ALIGN(4); |
||||
.text : |
||||
{ |
||||
*(.text) |
||||
} |
||||
|
||||
. = ALIGN(4); |
||||
.rodata : { *(.rodata) } |
||||
|
||||
. = ALIGN(4); |
||||
.data : { *(.data) } |
||||
|
||||
. = .; |
||||
_gp = ALIGN(16) + 0x7ff0; |
||||
|
||||
.got : { |
||||
__got_start = .; |
||||
*(.got) |
||||
__got_end = .; |
||||
} |
||||
|
||||
. = ALIGN(4); |
||||
.sdata : { *(.sdata) } |
||||
|
||||
. = ALIGN(4); |
||||
.u_boot_cmd : { |
||||
__u_boot_cmd_start = .; |
||||
*(.u_boot_cmd) |
||||
__u_boot_cmd_end = .; |
||||
} |
||||
|
||||
. = ALIGN(4); |
||||
uboot_end_data = .; |
||||
num_got_entries = (__got_end - __got_start) >> 2; |
||||
|
||||
. = ALIGN(4); |
||||
.sbss (NOLOAD) : { *(.sbss) } |
||||
. = ALIGN(4); |
||||
.bss (NOLOAD) : { *(.bss) } |
||||
uboot_end = .; |
||||
} |
@ -0,0 +1,117 @@ |
||||
/*
|
||||
* (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* Copyright (C) 2006 Micronas GmbH |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <command.h> |
||||
#include <asm/mipsregs.h> |
||||
#include "vct.h" |
||||
|
||||
#if defined(CONFIG_VCT_PREMIUM) |
||||
#define BOARD_NAME "PremiumD" |
||||
#elif defined(CONFIG_VCT_PLATINUM) |
||||
#define BOARD_NAME "PlatinumD" |
||||
#elif defined(CONFIG_VCT_PLATINUMAVC) |
||||
#define BOARD_NAME "PlatinumAVC" |
||||
#else |
||||
#error "vct: No board variant defined!" |
||||
#endif |
||||
|
||||
#if defined(CONFIG_VCT_ONENAND) |
||||
#define BOARD_NAME_ADD " OneNAND" |
||||
#else |
||||
#define BOARD_NAME_ADD " NOR" |
||||
#endif |
||||
|
||||
int board_early_init_f(void) |
||||
{ |
||||
/*
|
||||
* First initialize the PIN mulitplexing |
||||
*/ |
||||
vct_pin_mux_initialize(); |
||||
|
||||
/*
|
||||
* Init the EBI very early so that FLASH can be accessed |
||||
*/ |
||||
ebi_initialize(); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void _machine_restart(void) |
||||
{ |
||||
reg_write(DCGU_EN_WDT_RESET(DCGU_BASE), DCGU_MAGIC_WDT); |
||||
reg_write(WDT_TORR(WDT_BASE), 0x00); |
||||
reg_write(WDT_CR(WDT_BASE), 0x1D); |
||||
|
||||
/*
|
||||
* Now wait for the watchdog to trigger the reset |
||||
*/ |
||||
udelay(1000000); |
||||
} |
||||
|
||||
/*
|
||||
* SDRAM is already configured by the bootstrap code, only return the |
||||
* auto-detected size here |
||||
*/ |
||||
phys_size_t initdram(int board_type) |
||||
{ |
||||
return get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, |
||||
CONFIG_SYS_MBYTES_SDRAM << 20); |
||||
} |
||||
|
||||
int checkboard(void) |
||||
{ |
||||
u32 config0 = read_c0_prid(); |
||||
char *s = getenv("serial#"); |
||||
|
||||
if ((config0 & 0xff0000) == PRID_COMP_LEGACY |
||||
&& (config0 & 0xff00) == PRID_IMP_LX4280) { |
||||
puts("Board: MDED \n"); |
||||
printf("CPU: LX4280 id: 0x%02x, rev: 0x%02x\n", |
||||
(config0 >> 8) & 0xFF, config0 & 0xFF); |
||||
} else if ((config0 & 0xff0000) == PRID_COMP_MIPS |
||||
&& (config0 & 0xff00) == PRID_IMP_VGC) { |
||||
u32 jedec_id = *((u32 *) 0xBEBC71A0); |
||||
if ((((jedec_id) >> 12) & 0xFF) == 0x40) { |
||||
puts("Board: VGCA \n"); |
||||
} else if ((((jedec_id) >> 12) & 0xFF) == 0x48 |
||||
|| (((jedec_id) >> 12) & 0xFF) == 0x49) { |
||||
puts("Board: VGCB \n"); |
||||
} |
||||
printf("CPU: MIPS 4K id: 0x%02x, rev: 0x%02x\n", |
||||
(config0 >> 8) & 0xFF, config0 & 0xFF); |
||||
} else if (config0 == 0x19378) { |
||||
printf("CPU: MIPS 24K id: 0x%02x, rev: 0x%02x\n", |
||||
(config0 >> 8) & 0xFF, config0 & 0xFF); |
||||
} else { |
||||
printf("Unsupported cpu %d, proc_id=0x%x\n", config0 >> 24, |
||||
config0); |
||||
} |
||||
|
||||
printf("Board: Micronas VCT " BOARD_NAME BOARD_NAME_ADD); |
||||
if (s != NULL) { |
||||
puts(", serial# "); |
||||
puts(s); |
||||
} |
||||
putc('\n'); |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,104 @@ |
||||
/*
|
||||
* (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* Copyright (C) 2006 Micronas GmbH |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <asm/io.h> |
||||
|
||||
#include "bcu.h" |
||||
#include "dcgu.h" |
||||
#include "ebi.h" |
||||
#include "scc.h" |
||||
|
||||
#ifdef CONFIG_VCT_PREMIUM |
||||
/* Global start address of all memory mapped registers */ |
||||
#define REG_GLOBAL_START_ADDR 0xbf800000 |
||||
#define TOP_BASE 0x000c8000 |
||||
|
||||
#include "vcth/reg_ebi.h" |
||||
#include "vcth/reg_dcgu.h" |
||||
#include "vcth/reg_wdt.h" |
||||
#include "vcth/reg_gpio.h" |
||||
#include "vcth/reg_fwsram.h" |
||||
#include "vcth/reg_scc.h" |
||||
#include "vcth/reg_usbh.h" |
||||
#endif |
||||
|
||||
#ifdef CONFIG_VCT_PLATINUM |
||||
/* Global start address of all memory mapped registers */ |
||||
#define REG_GLOBAL_START_ADDR 0xbf800000 |
||||
#define TOP_BASE 0x000c8000 |
||||
|
||||
#include "vcth2/reg_ebi.h" |
||||
#include "vcth/reg_dcgu.h" |
||||
#include "vcth/reg_wdt.h" |
||||
#include "vcth/reg_gpio.h" |
||||
#include "vcth/reg_fwsram.h" |
||||
#include "vcth/reg_scc.h" |
||||
#include "vcth/reg_usbh.h" |
||||
#endif |
||||
|
||||
#ifdef CONFIG_VCT_PLATINUMAVC |
||||
/* Global start address of all memory mapped registers */ |
||||
#define REG_GLOBAL_START_ADDR 0xbdc00000 |
||||
#define TOP_BASE 0x00050000 |
||||
|
||||
#include "vctv/reg_ebi.h" |
||||
#include "vctv/reg_dcgu.h" |
||||
#include "vctv/reg_wdt.h" |
||||
#include "vctv/reg_gpio.h" |
||||
#endif |
||||
|
||||
#ifndef _VCT_H |
||||
#define _VCT_H |
||||
|
||||
/*
|
||||
* Defines |
||||
*/ |
||||
#define PRID_COMP_LEGACY 0x000000 |
||||
#define PRID_COMP_MIPS 0x010000 |
||||
#define PRID_IMP_LX4280 0xc200 |
||||
#define PRID_IMP_VGC 0x9000 |
||||
|
||||
/*
|
||||
* Prototypes |
||||
*/ |
||||
int ebi_initialize(void); |
||||
int ebi_init_nor_flash(void); |
||||
int ebi_init_onenand(void); |
||||
int ebi_init_smc911x(void); |
||||
u32 smc911x_reg_read(u32 addr); |
||||
void smc911x_reg_write(u32 addr, u32 data); |
||||
int top_set_pin(int pin, int func); |
||||
void vct_pin_mux_initialize(void); |
||||
|
||||
/*
|
||||
* static inlines |
||||
*/ |
||||
static inline void reg_write(u32 addr, u32 data) |
||||
{ |
||||
__raw_writel(data, addr + REG_GLOBAL_START_ADDR); |
||||
} |
||||
|
||||
static inline u32 reg_read(u32 addr) |
||||
{ |
||||
return __raw_readl(addr + REG_GLOBAL_START_ADDR); |
||||
} |
||||
|
||||
#endif /* _VCT_H */ |
@ -0,0 +1,340 @@ |
||||
/*
|
||||
* (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
/*
|
||||
* This file contains the configuration parameters for the VCT board |
||||
* family: |
||||
* |
||||
* vct_premium |
||||
* vct_premium_small |
||||
* vct_premium_onenand |
||||
* vct_premium_onenand_small |
||||
* vct_platinum |
||||
* vct_platinum_small |
||||
* vct_platinum_onenand |
||||
* vct_platinum_onenand_small |
||||
* vct_platinumavc |
||||
* vct_platinumavc_small |
||||
* vct_platinumavc_onenand |
||||
* vct_platinumavc_onenand_small |
||||
*/ |
||||
|
||||
#ifndef __CONFIG_H |
||||
#define __CONFIG_H |
||||
|
||||
#define CONFIG_MIPS32 /* MIPS 4Kc CPU core */ |
||||
#define CPU_CLOCK_RATE 324000000 /* Clock for the MIPS core */ |
||||
#define CONFIG_SYS_MIPS_TIMER_FREQ (CPU_CLOCK_RATE / 2) |
||||
#define CONFIG_SYS_HZ 1000 |
||||
|
||||
#define CONFIG_SKIP_LOWLEVEL_INIT /* SDRAM is initialized by the bootstrap code */ |
||||
|
||||
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE |
||||
#define CONFIG_SYS_MONITOR_LEN (256 << 10) |
||||
#define CONFIG_STACKSIZE (256 << 10) |
||||
#define CONFIG_SYS_MALLOC_LEN (1 << 20) |
||||
#define CONFIG_SYS_BOOTPARAMS_LEN (128 << 10) |
||||
#define CONFIG_SYS_INIT_SP_OFFSET 0x400000 |
||||
|
||||
#if !defined(CONFIG_VCT_NAND) && !defined(CONFIG_VCT_ONENAND) |
||||
#define CONFIG_VCT_NOR |
||||
#else |
||||
#define CONFIG_SYS_NO_FLASH |
||||
#endif |
||||
|
||||
/*
|
||||
* UART |
||||
*/ |
||||
#define CONFIG_VCT_SERIAL |
||||
#define CONFIG_BAUDRATE 115200 |
||||
#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } |
||||
|
||||
/*
|
||||
* SDRAM |
||||
*/ |
||||
#define CONFIG_SYS_SDRAM_BASE 0x80000000 |
||||
#define CONFIG_SYS_MBYTES_SDRAM 128 |
||||
#define CONFIG_SYS_MEMTEST_START 0x80200000 |
||||
#define CONFIG_SYS_MEMTEST_END 0x80400000 |
||||
#define CONFIG_SYS_LOAD_ADDR 0x80400000 /* default load address */ |
||||
|
||||
#if defined(CONFIG_VCT_PREMIUM) || defined(CONFIG_VCT_PLATINUM) |
||||
/*
|
||||
* SMSC91C11x Network Card |
||||
*/ |
||||
#define CONFIG_DRIVER_SMC911X |
||||
#define CONFIG_DRIVER_SMC911X_BASE 0x00000000 |
||||
#define CONFIG_DRIVER_SMC911X_32_BIT |
||||
#define CONFIG_NET_RETRY_COUNT 20 |
||||
#endif |
||||
|
||||
/*
|
||||
* Commands |
||||
*/ |
||||
#include <config_cmd_default.h> |
||||
|
||||
#define CONFIG_CMD_DHCP |
||||
#define CONFIG_CMD_ELF |
||||
#define CONFIG_CMD_EEPROM |
||||
#define CONFIG_CMD_I2C |
||||
|
||||
/*
|
||||
* Only Premium/Platinum have ethernet support right now |
||||
*/ |
||||
#if defined(CONFIG_VCT_PREMIUM) || defined(CONFIG_VCT_PLATINUM) |
||||
#define CONFIG_CMD_PING |
||||
#define CONFIG_CMD_SNTP |
||||
#else |
||||
#undef CONFIG_CMD_NET |
||||
#endif |
||||
|
||||
/*
|
||||
* Only Premium/Platinum have USB-EHCI support right now |
||||
*/ |
||||
#if defined(CONFIG_VCT_PREMIUM) || defined(CONFIG_VCT_PLATINUM) |
||||
#define CONFIG_CMD_USB |
||||
#define CONFIG_CMD_FAT |
||||
#endif |
||||
|
||||
#if defined(CONFIG_CMD_USB) |
||||
#define CONFIG_USB_STORAGE |
||||
#define CONFIG_DOS_PARTITION |
||||
#define CONFIG_ISO_PARTITION |
||||
|
||||
#define CONFIG_SUPPORT_VFAT |
||||
|
||||
/*
|
||||
* USB/EHCI |
||||
*/ |
||||
#define CONFIG_USB_EHCI /* Enable EHCI USB support */ |
||||
#define CONFIG_USB_EHCI_VCT /* on VCT platform */ |
||||
#define CONFIG_EHCI_DCACHE /* with dcache handling support */ |
||||
#define CONFIG_EHCI_MMIO_BIG_ENDIAN |
||||
#define CONFIG_EHCI_DESC_BIG_ENDIAN |
||||
#define CONFIG_EHCI_IS_TDI |
||||
#define CONFIG_EHCI_HCD_INIT_AFTER_RESET /* re-init HCD after CMD_RESET */ |
||||
#endif /* CONFIG_CMD_USB */ |
||||
|
||||
#if !defined(CONFIG_VCT_NOR) |
||||
#undef CONFIG_CMD_FLASH |
||||
#undef CONFIG_CMD_IMLS |
||||
#endif |
||||
|
||||
#if defined(CONFIG_VCT_NAND) |
||||
#define CONFIG_CMD_NAND |
||||
#endif |
||||
|
||||
#if defined(CONFIG_VCT_ONENAND) |
||||
#define CONFIG_CMD_ONENAND |
||||
#endif |
||||
|
||||
/*
|
||||
* BOOTP options |
||||
*/ |
||||
#define CONFIG_BOOTP_BOOTFILESIZE |
||||
#define CONFIG_BOOTP_BOOTPATH |
||||
#define CONFIG_BOOTP_GATEWAY |
||||
#define CONFIG_BOOTP_HOSTNAME |
||||
#define CONFIG_BOOTP_SUBNETMASK |
||||
|
||||
/*
|
||||
* Miscellaneous configurable options |
||||
*/ |
||||
#define CONFIG_SYS_LONGHELP /* undef to save memory */ |
||||
#define CONFIG_SYS_PROMPT "VCT# " /* Monitor Command Prompt */ |
||||
#define CONFIG_SYS_CBSIZE 512 /* Console I/O Buffer Size */ |
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \ |
||||
sizeof(CONFIG_SYS_PROMPT) + 16) |
||||
#define CONFIG_SYS_MAXARGS 16 /* max number of command args */ |
||||
#define CONFIG_TIMESTAMP /* Print image info with timestamp */ |
||||
#define CONFIG_CMDLINE_EDITING /* add command line history */ |
||||
#define CONFIG_SYS_CONSOLE_INFO_QUIET /* don't print console @ startup*/ |
||||
|
||||
/*
|
||||
* FLASH and environment organization |
||||
*/ |
||||
#if defined(CONFIG_VCT_NOR) |
||||
#define CONFIG_ENV_IS_IN_FLASH |
||||
#define CONFIG_FLASH_NOT_MEM_MAPPED |
||||
|
||||
/*
|
||||
* We need special accessor functions for the CFI FLASH driver. This |
||||
* can be enabled via the CONFIG_CFI_FLASH_USE_WEAK_ACCESSORS option. |
||||
*/ |
||||
#define CONFIG_CFI_FLASH_USE_WEAK_ACCESSORS |
||||
|
||||
/*
|
||||
* For the non-memory-mapped NOR FLASH, we need to define the |
||||
* NOR FLASH area. This can't be detected via the addr2info() |
||||
* function, since we check for flash access in the very early |
||||
* U-Boot code, before the NOR FLASH is detected. |
||||
*/ |
||||
#define CONFIG_FLASH_BASE 0xb0000000 |
||||
#define CONFIG_FLASH_END 0xbfffffff |
||||
|
||||
/*
|
||||
* CFI driver settings |
||||
*/ |
||||
#define CONFIG_SYS_FLASH_CFI /* The flash is CFI compatible */ |
||||
#define CONFIG_FLASH_CFI_DRIVER /* Use common CFI driver */ |
||||
#define CONFIG_SYS_FLASH_CFI_AMD_RESET 1 /* Use AMD (Spansion) reset cmd */ |
||||
#define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_16BIT /* no byte writes on IXP4xx */ |
||||
|
||||
#define CONFIG_SYS_FLASH_BASE 0xb0000000 |
||||
#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE } |
||||
#define CONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */ |
||||
#define CONFIG_SYS_MAX_FLASH_SECT 512 /* max number of sectors on one chip */ |
||||
|
||||
#define CONFIG_SYS_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms) */ |
||||
#define CONFIG_SYS_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms) */ |
||||
|
||||
#ifdef CONFIG_ENV_IS_IN_FLASH |
||||
#define CONFIG_ENV_SECT_SIZE 0x10000 /* size of one complete sector */ |
||||
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + CONFIG_SYS_MONITOR_LEN) |
||||
#define CONFIG_ENV_SIZE 0x4000 /* Total Size of Environment Sector */ |
||||
|
||||
/* Address and size of Redundant Environment Sector */ |
||||
#define CONFIG_ENV_ADDR_REDUND (CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE) |
||||
#define CONFIG_ENV_SIZE_REDUND (CONFIG_ENV_SIZE) |
||||
#endif /* CONFIG_ENV_IS_IN_FLASH */ |
||||
#endif /* CONFIG_VCT_NOR */ |
||||
|
||||
#if defined(CONFIG_VCT_ONENAND) |
||||
#define CONFIG_USE_ONENAND_BOARD_INIT |
||||
#define CONFIG_ENV_IS_IN_ONENAND |
||||
#define CONFIG_SYS_ONENAND_BASE 0x00000000 /* this is not real address */ |
||||
#define CONFIG_SYS_FLASH_BASE 0x00000000 |
||||
#define CONFIG_ENV_ADDR (128 << 10) /* after compr. U-Boot image */ |
||||
#define CONFIG_ENV_SIZE (128 << 10) /* erase size */ |
||||
#endif /* CONFIG_VCT_ONENAND */ |
||||
|
||||
/*
|
||||
* Cache Configuration |
||||
*/ |
||||
#define CONFIG_SYS_DCACHE_SIZE 16384 |
||||
#define CONFIG_SYS_ICACHE_SIZE 16384 |
||||
#define CONFIG_SYS_CACHELINE_SIZE 32 |
||||
|
||||
/*
|
||||
* I2C/EEPROM |
||||
*/ |
||||
#undef CONFIG_HARD_I2C /* I2C with hardware support */ |
||||
#define CONFIG_SOFT_I2C /* I2C bit-banged */ |
||||
|
||||
#define CONFIG_SYS_I2C_SPEED 83000 /* 83 kHz is supposed to work */ |
||||
#define CONFIG_SYS_I2C_SLAVE 0x7f |
||||
|
||||
/*
|
||||
* Software (bit-bang) I2C driver configuration |
||||
*/ |
||||
#define CONFIG_SYS_GPIO_I2C_SCL 11 |
||||
#define CONFIG_SYS_GPIO_I2C_SDA 10 |
||||
|
||||
#ifndef __ASSEMBLY__ |
||||
int vct_gpio_dir(int pin, int dir); |
||||
void vct_gpio_set(int pin, int val); |
||||
int vct_gpio_get(int pin); |
||||
#endif |
||||
|
||||
#define I2C_INIT vct_gpio_dir(CONFIG_SYS_GPIO_I2C_SCL, 1) |
||||
#define I2C_ACTIVE vct_gpio_dir(CONFIG_SYS_GPIO_I2C_SDA, 1) |
||||
#define I2C_TRISTATE vct_gpio_dir(CONFIG_SYS_GPIO_I2C_SDA, 0) |
||||
#define I2C_READ vct_gpio_get(CONFIG_SYS_GPIO_I2C_SDA) |
||||
#define I2C_SDA(bit) vct_gpio_set(CONFIG_SYS_GPIO_I2C_SDA, bit) |
||||
#define I2C_SCL(bit) vct_gpio_set(CONFIG_SYS_GPIO_I2C_SCL, bit) |
||||
#define I2C_DELAY udelay(5) /* 1/4 I2C clock duration */ |
||||
|
||||
#define CONFIG_SYS_I2C_EEPROM_ADDR 0x50 |
||||
/* CAT24WC32 */ |
||||
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2 /* Bytes of address */ |
||||
#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 5 /* The Catalyst CAT24WC32 has */ |
||||
/* 32 byte page write mode using*/ |
||||
/* last 5 bits of the address */ |
||||
#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 10 /* and takes up to 10 msec */ |
||||
|
||||
#define CONFIG_BOOTCOMMAND "run test3" |
||||
#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */ |
||||
|
||||
/*
|
||||
* Needed for 64bit printf format |
||||
*/ |
||||
#define CONFIG_SYS_64BIT_VSPRINTF 1 |
||||
#define CONFIG_SYS_64BIT_STRTOUL 1 |
||||
|
||||
/*
|
||||
* UBI configuration |
||||
*/ |
||||
#if defined(CONFIG_VCT_ONENAND) |
||||
#define CONFIG_SYS_USE_UBI |
||||
#define CONFIG_CMD_JFFS2 |
||||
#define CONFIG_CMD_UBI |
||||
#define CONFIG_RBTREE |
||||
#define CONFIG_MTD_PARTITIONS |
||||
#define CONFIG_JFFS2_CMDLINE |
||||
|
||||
#define MTDIDS_DEFAULT "onenand0=onenand" |
||||
#define MTDPARTS_DEFAULT "mtdparts=onenand:128k(u-boot)," \ |
||||
"128k(env)," \
|
||||
"20m(kernel)," \
|
||||
"-(rootfs)" |
||||
#endif |
||||
|
||||
/*
|
||||
* We need a small, stripped down image to fit into the first 128k OneNAND |
||||
* erase block (gzipped). This image only needs basic commands for FLASH |
||||
* (NOR/OneNAND) usage and Linux kernel booting. |
||||
*/ |
||||
#if defined(CONFIG_VCT_SMALL_IMAGE) |
||||
#undef CONFIG_CMD_EEPROM |
||||
#undef CONFIG_CMD_I2C |
||||
#undef CONFIG_CMD_NET |
||||
#undef CONFIG_CMD_PING |
||||
#undef CONFIG_CMD_SNTP |
||||
#undef CONFIG_CMD_ELF |
||||
#undef CONFIG_CMD_CONSOLE |
||||
#undef CONFIG_CMD_CACHE |
||||
#undef CONFIG_CMD_BEDBUG |
||||
#undef CONFIG_CMD_AUTOSCRIPT |
||||
#undef CONFIG_CMD_IRQ |
||||
#undef CONFIG_CMD_ITEST |
||||
#undef CONFIG_CMD_MII |
||||
#undef CONFIG_CMD_MISC |
||||
#undef CONFIG_CMD_REGINFO |
||||
#undef CONFIG_CMD_STRINGS |
||||
#undef CONFIG_CMD_TERMINAL |
||||
#undef CONFIG_CMD_ASKENV |
||||
#undef CONFIG_CMD_CRC32 |
||||
#undef CONFIG_CMD_DHCP |
||||
#undef CONFIG_CMD_EEPROM |
||||
#undef CONFIG_CMD_I2C |
||||
#undef CONFIG_CMD_LOADB |
||||
#undef CONFIG_CMD_LOADS |
||||
#undef CONFIG_CMD_LOADY |
||||
#undef CONFIG_CMD_BDI |
||||
#undef CONFIG_CMD_USB |
||||
#undef CONFIG_CMD_FAT |
||||
|
||||
#undef CONFIG_DRIVER_SMC911X |
||||
#undef CONFIG_SOFT_I2C |
||||
#undef CONFIG_AUTOSCRIPT |
||||
#undef CONFIG_SYS_LONGHELP |
||||
#undef CONFIG_TIMESTAMP |
||||
#endif /* CONFIG_VCT_SMALL_IMAGE */ |
||||
|
||||
#endif /* __CONFIG_H */ |
Loading…
Reference in new issue