Date: Wed, 8 Aug 2007 16:41:52 +0200 From: Bernd Walter <ticso@cicely12.cicely.de> To: Krassimir Slavchev <krassi@bulinfo.net> Cc: freebsd-arm@freebsd.org Subject: Re: CENTIPAD boot Message-ID: <20070808144152.GM41893@cicely12.cicely.de> In-Reply-To: <46B9CAD8.4040103@bulinfo.net> References: <46B9C68E.2010000@bulinfo.net> <20070808.074028.-749249084.imp@bsdimp.com> <46B9CAD8.4040103@bulinfo.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Aug 08, 2007 at 04:53:28PM +0300, Krassimir Slavchev wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Yes > > M. Warner Losh wrote: > > can you resend them as a unified diff? > > > > Warner > > Mmm - there are points, which look at least questionable. And there are a few, which are likely not related to support another board. > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.7 (FreeBSD) > > iD8DBQFGucrYxJBWvpalMpkRAj4oAJwOYAKhGu2P20acoOPgrkEQSjyETwCgnvjq > DNWbeBl9Wlk2oIVy6bwUJdY= > =sEQp > -----END PGP SIGNATURE----- > Index: boot0spi/main.c > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/boot0spi/main.c,v > retrieving revision 1.5 > diff -u -r1.5 main.c > --- boot0spi/main.c 20 Dec 2006 17:50:02 -0000 1.5 > +++ boot0spi/main.c 8 Aug 2007 13:49:19 -0000 > @@ -47,10 +47,10 @@ > continue; > // Need extra copy at addr3 > memcpy(addr3, addr, (len + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE * FLASH_PAGE_SIZE); > - printf("Writing %u bytes to flash at %u\n", len, OFFSET); > + printf("Writing %u bytes to flash at %u\n", len, LOADER_OFFSET); > for (i = 0; i < len; i+= FLASH_PAGE_SIZE) { > for (j = 0; j < 10; j++) { > - off = i + OFFSET; > + off = i + LOADER_OFFSET; > SPI_WriteFlash(off, addr + i, FLASH_PAGE_SIZE); > SPI_ReadFlash(off, addr2 + i, FLASH_PAGE_SIZE); > if (p_memcmp(addr3 + i, addr2 + i, FLASH_PAGE_SIZE) == 0) This is unrelated, but important. > Index: bootspi/loader_prompt.c > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/bootspi/loader_prompt.c,v > retrieving revision 1.4 > diff -u -r1.4 loader_prompt.c > --- bootspi/loader_prompt.c 15 Mar 2007 03:31:48 -0000 1.4 > +++ bootspi/loader_prompt.c 8 Aug 2007 13:49:21 -0000 > @@ -29,7 +29,6 @@ > #include "env_vars.h" > #include "lib.h" > #include "spi_flash.h" > -#include "ee.h" > > /******************************* GLOBALS *************************************/ > > @@ -286,8 +285,9 @@ > { > char buf[25]; > printf("Testing Config EEPROM\n"); > - EEWrite(0, "This is a test", 15); > - EERead(0, buf, 15); > + strcpy(buf,"This is a test!"); > + WriteEEPROM(0, buf, 15); > + ReadEEPROM(0, buf, 15); > printf("Found '%s'\n", buf); > break; > } Why remove ee.h and then access the eeprom? I never used the eeprom code, so I'm unshure about it. At least the following line should be added befor printing: buf[15] = '\0'; > Index: bootspi/main.c > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/bootspi/main.c,v > retrieving revision 1.3 > diff -u -r1.3 main.c > --- bootspi/main.c 21 Oct 2006 22:44:26 -0000 1.3 > +++ bootspi/main.c 8 Aug 2007 13:49:21 -0000 > @@ -41,18 +41,19 @@ > #include "emac.h" > #include "lib.h" > #include "spi_flash.h" > -#include "ee.h" > +#include "sd-card.h" > > int > main(void) > { > printf("\nBoot\n"); > - EEInit(); > + InitEEPROM(); > SPI_InitFlash(); > #ifdef TSC_FPGA > fpga_load(); > #endif > EMAC_Init(); > + sdcard_init(); > LoadBootCommands(); > if (getc(1) == -1) { > start_wdog(30); The same as above - remove ee.h and then access the eeprom? I have the sdcard_init in my local changes as well. Although it might be better to just init the GPIO, because that's what we really want in case of spi booting. I typically need this to do a network boot and then access the SD card, which requires something like this. > Index: libat91/Makefile > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/libat91/Makefile,v > retrieving revision 1.9 > diff -u -r1.9 Makefile > --- libat91/Makefile 13 Jul 2007 14:27:04 -0000 1.9 > +++ libat91/Makefile 8 Aug 2007 13:49:22 -0000 > @@ -8,7 +8,7 @@ > putchar.c printf.c reset.c spi_flash.c xmodem.c \ > sd-card.c strcvt.c strlen.c strcmp.c memcpy.c strcpy.c \ > memset.c memcmp.c > -SRCS+=ashldi3.c divsi3.c > +SRCS+=ashldi3.c divsi3.S > NO_MAN= > > .if ${MK_TAG_LIST} != "no" Why is the filename change needed? This is obviously unrelated to the board support. Do we have a Makefile error in CVS? > Index: libat91/arm_init.S > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/libat91/arm_init.S,v > retrieving revision 1.2 > diff -u -r1.2 arm_init.S > --- libat91/arm_init.S 20 Dec 2006 18:16:49 -0000 1.2 > +++ libat91/arm_init.S 8 Aug 2007 13:49:22 -0000 > @@ -61,7 +61,7 @@ > #ifdef BOOT_IIC > .long (TWI_EEPROM_SIZE >> 9) > #else > -#ifdef BOOT_BWCT > +#if defined(BOOT_BWCT) | defined(BOOT_CENTIPAD) > .long ((528 << 17) | (13 << 13) | (12 * 2)) > #else > .long ((1056 << 17) | (13 << 13) | (12 * 2)) In the long run we should start defining those things to align with the SPI flash type and then just setup the type related to the board. > Index: libat91/eeprom.c > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/libat91/eeprom.c,v > retrieving revision 1.3 > diff -u -r1.3 eeprom.c > --- libat91/eeprom.c 20 Dec 2006 18:19:52 -0000 1.3 > +++ libat91/eeprom.c 8 Aug 2007 13:49:23 -0000 > @@ -33,7 +33,11 @@ > > /* Use a macro to calculate the TWI clock generator value to save code space. */ > #define AT91C_TWSI_CLOCK 100000 > -#define TWSI_EEPROM_ADDRESS 0x50 > +#ifdef BOOT_CENTIPAD > +#define TWSI_EEPROM_ADDRESS 0x57 > +#else > +#define TWSI_EEPROM_ADDRESS 0x50 > +#endif > > #define TWI_CLK_BASE_DIV ((AT91C_MASTER_CLOCK/(4*AT91C_TWSI_CLOCK)) - 2) > #define SET_TWI_CLOCK ((0x00010000) | (TWI_CLK_BASE_DIV) | (TWI_CLK_BASE_DIV << 8)) > Index: libat91/emac.c > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/libat91/emac.c,v > retrieving revision 1.8 > diff -u -r1.8 emac.c > --- libat91/emac.c 13 Jul 2007 14:27:04 -0000 1.8 > +++ libat91/emac.c 8 Aug 2007 13:49:25 -0000 > @@ -321,7 +321,7 @@ > if (serverPort != udpHdr->src_port) > break; > > - TFTP_ACK_Data(tftpHdr->data, > + TFTP_ACK_Data((char *)tftpHdr->data, > SWAP16(tftpHdr->block_num), > SWAP16(udpHdr->udp_len) - 12); > } This chunk seems to be unrelated to the board type as well. > @@ -339,9 +339,9 @@ > */ > #ifndef BOOT_BWCT > static unsigned short > -AT91F_MII_ReadPhy (AT91PS_EMAC pEmac, unsigned char addr) > +AT91F_MII_ReadPhy (AT91PS_EMAC pEmac, unsigned char phyaddr, unsigned char addr) > { > - unsigned value = 0x60020000 | (addr << 18); > + unsigned value = 0x60020000 | ((phyaddr & 0x1f) << 23) | (addr << 18); > > pEmac->EMAC_CTL |= AT91C_EMAC_MPE; > pEmac->EMAC_MAN = value; > @@ -359,9 +359,9 @@ > */ > #ifdef BOOT_TSC > static unsigned short > -AT91F_MII_WritePhy (AT91PS_EMAC pEmac, unsigned char addr, unsigned short s) > +AT91F_MII_WritePhy (AT91PS_EMAC pEmac, unsigned char phyaddr, unsigned char addr, unsigned short s) > { > - unsigned value = 0x50020000 | (addr << 18) | s; > + unsigned value = 0x50020000 | ((phyaddr & 0x1f) << 23) | (addr << 18) | s; > > pEmac->EMAC_CTL |= AT91C_EMAC_MPE; > pEmac->EMAC_MAN = value; > @@ -380,6 +380,7 @@ > static void > MII_GetLinkSpeed(AT91PS_EMAC pEmac) > { > + unsigned char phyaddr = 0; > #if defined(BOOT_TSC) || defined(BOOT_KB920X) || defined(BOOT_CENTIPAD) > unsigned short stat2; > #endif > @@ -388,14 +389,18 @@ > unsigned sec; > int i; > #endif > -#ifdef BOOT_BWCT > +#ifdef BOOT_CENTIPAD > + phyaddr = 0x10; > +#endif > + > +#if defined(BOOT_BWCT) | defined(BOOT_CENTIPAD) > /* hardcoded link speed since we connect a switch via MII */ > update = pEmac->EMAC_CFG & ~(AT91C_EMAC_SPD | AT91C_EMAC_FD); > update |= AT91C_EMAC_SPD; > update |= AT91C_EMAC_FD; > #endif > #if defined(BOOT_KB920X) || defined(BOOT_CENTIPAD) > - stat2 = AT91F_MII_ReadPhy(pEmac, MII_STS2_REG); > + stat2 = AT91F_MII_ReadPhy(pEmac, phyaddr, MII_STS2_REG); > if (!(stat2 & MII_STS2_LINK)) > return ; > update = pEmac->EMAC_CFG & ~(AT91C_EMAC_SPD | AT91C_EMAC_FD); > @@ -407,7 +412,7 @@ > #ifdef BOOT_TSC > while (1) { > for (i = 0; i < 10; i++) { > - stat2 = AT91F_MII_ReadPhy(pEmac, MII_STS_REG); > + stat2 = AT91F_MII_ReadPhy(pEmac, phyaddr, MII_STS_REG); > if (stat2 & MII_STS_LINK_STAT) > break; > printf("."); > @@ -418,11 +423,11 @@ > if (stat2 & MII_STS_LINK_STAT) > break; > printf("Resetting MII..."); > - AT91F_MII_WritePhy(pEmac, 0x0, 0x8000); > - while (AT91F_MII_ReadPhy(pEmac, 0x0) & 0x8000) continue; > + AT91F_MII_WritePhy(pEmac, phyaddr, 0x0, 0x8000); > + while (AT91F_MII_ReadPhy(pEmac, phyaddr, 0x0) & 0x8000) continue; > } > printf("emac: link"); > - stat2 = AT91F_MII_ReadPhy(pEmac, MII_SPEC_STS_REG); > + stat2 = AT91F_MII_ReadPhy(pEmac, phyaddr, MII_SPEC_STS_REG); > update = pEmac->EMAC_CFG & ~(AT91C_EMAC_SPD | AT91C_EMAC_FD); > if (stat2 & (MII_SSTS_100FDX | MII_SSTS_100HDX)) { > printf(" 100TX"); Are you shure, that you want to nail the link speed too 100/full? It is only reasonable if you have a switch, but then it wouldn't make sense to set a hardcoded phyaddr for your board, since almost every switch I know uses multiple phy-addresses. On the other hand - I like the phyaddr change, because it will allow me to setup my switch from loader some day and not from kernel, as I do now. > Index: libat91/emac_init.c > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/libat91/emac_init.c,v > retrieving revision 1.4 > diff -u -r1.4 emac_init.c > --- libat91/emac_init.c 20 Dec 2006 18:26:37 -0000 1.4 > +++ libat91/emac_init.c 8 Aug 2007 13:49:26 -0000 > @@ -94,7 +94,7 @@ > AT91C_PA8_ETXEN | AT91C_PA16_EMDIO | AT91C_PA9_ETX0 | > AT91C_PA10_ETX1 | AT91C_PA11_ECRS_ECRSDV | AT91C_PA15_EMDC | > AT91C_PA7_ETXCK_EREFCK; > -#if defined(BOOT_KB920X) | defined(BOOT_BWCT) /* Really !RMII */ > +#if defined(BOOT_KB920X) | defined(BOOT_BWCT) | defined(BOOT_CENTIPAD) /* Really !RMII */ > AT91C_BASE_PIOB->PIO_BSR = > AT91C_PB12_ETX2 | AT91C_PB13_ETX3 | AT91C_PB14_ETXER | > AT91C_PB15_ERX2 | AT91C_PB16_ERX3 | AT91C_PB17_ERXDV | > Index: libat91/spi_flash.c > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/libat91/spi_flash.c,v > retrieving revision 1.4 > diff -u -r1.4 spi_flash.c > --- libat91/spi_flash.c 28 Mar 2007 22:38:01 -0000 1.4 > +++ libat91/spi_flash.c 8 Aug 2007 13:49:26 -0000 > @@ -119,7 +119,7 @@ > byteAddress = flash_addr % FLASH_PAGE_SIZE; > > p_memset(tx_commandBuffer, 0, 8); > -#ifdef BOOT_BWCT > +#if defined(BOOT_BWCT) | defined(BOOT_CENTIPAD) > tx_commandBuffer[0] = 0xd2; > tx_commandBuffer[1] = ((pageAddress >> 6) & 0xFF); > tx_commandBuffer[2] = ((pageAddress << 2) & 0xFC) | > @@ -177,7 +177,7 @@ > byteAddress = flash_addr % FLASH_PAGE_SIZE; > > p_memset(tx_commandBuffer, 0, 8); > -#ifdef BOOT_BWCT > +#if defined(BOOT_BWCT) | defined(BOOT_CENTIPAD) > tx_commandBuffer[0] = 0x82; > tx_commandBuffer[1] = ((pageAddress >> 6) & 0xFF); > tx_commandBuffer[2] = ((pageAddress << 2) & 0xFC) | > @@ -256,7 +256,7 @@ > value = pSPI->SPI_RDR; > value = pSPI->SPI_SR; > > -#ifdef BOOT_BWCT > +#if defined(BOOT_BWCT) | defined(BOOT_CENTIPAD) > if (((value = GetFlashStatus()) & 0xFC) != 0xB4) > printf(" Bad SPI status: 0x%x\n", value); > #else Although this is correct with our current code. Please split BOOT_BWCT and BOOT_CENTIPAD here, since I localy have 0xAC added as a valid status: #ifdef BOOT_BWCT value = GetFlashStatus(); if ((value & 0xFC) != 0xAC && (value & 0xFC) != 0xB4) printf(" Bad SPI status: 0x%x\n", value); #else This is because I use AT45DB161D chips in production. The 0xB4 is from the AT45DB321C, which I'd used in prototypes only. I might use other SPI types for special purspose as well. > Index: libat91/spi_flash.h > =================================================================== > RCS file: /home/ncvs/src/sys/boot/arm/at91/libat91/spi_flash.h,v > retrieving revision 1.2 > diff -u -r1.2 spi_flash.h > --- libat91/spi_flash.h 20 Dec 2006 18:25:16 -0000 1.2 > +++ libat91/spi_flash.h 8 Aug 2007 13:49:26 -0000 > @@ -40,7 +40,7 @@ > > void SPI_GetId(unsigned *id); > > -#ifdef BOOT_BWCT > +#if defined(BOOT_BWCT) | defined(BOOT_CENTIPAD) > #define FLASH_PAGE_SIZE 528 > #else > #define FLASH_PAGE_SIZE 1056 -- B.Walter http://www.bwct.de http://www.fizon.de bernd@bwct.de info@bwct.de support@fizon.de
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070808144152.GM41893>