[U-Boot] [PATCH] add ASTRO MCF5373L board

Wolfgang Denk wd at denx.de
Thu Dec 17 23:33:07 CET 2009


Dear Wolfgang Wegner,

In message <1260378648-19232-1-git-send-email-w.wegner at astro-kom.de> you wrote:
> This patch adds support for ASTRO board(s) based on MCF5373L.
> 
> Signed-off-by: Wolfgang Wegner <w.wegner at astro-kom.de>
> ---
> There is another board (series) in the queue to be submitted, thus
> I added a subdirectory for all our boards.
> 
>  Makefile                         |   12 +
>  board/astro/mcf5373l/Makefile    |   44 +++
>  board/astro/mcf5373l/astro.h     |   39 +++
>  board/astro/mcf5373l/config.mk   |   28 ++
>  board/astro/mcf5373l/fpga.c      |  424 +++++++++++++++++++++++
>  board/astro/mcf5373l/mcf5373l.c  |  204 +++++++++++
>  board/astro/mcf5373l/u-boot.lds  |  142 ++++++++
>  board/astro/mcf5373l/update.c    |  699 ++++++++++++++++++++++++++++++++++++++
>  include/configs/astro_mcf5373l.h |  516 ++++++++++++++++++++++++++++
>  9 files changed, 2108 insertions(+), 0 deletions(-)
>  create mode 100644 board/astro/mcf5373l/Makefile
>  create mode 100644 board/astro/mcf5373l/astro.h
>  create mode 100644 board/astro/mcf5373l/config.mk
>  create mode 100644 board/astro/mcf5373l/fpga.c
>  create mode 100644 board/astro/mcf5373l/mcf5373l.c
>  create mode 100644 board/astro/mcf5373l/u-boot.lds
>  create mode 100644 board/astro/mcf5373l/update.c
>  create mode 100644 include/configs/astro_mcf5373l.h

Entries for MAINTAINERS and MAKEALL missing.

> diff --git a/Makefile b/Makefile
> index 75b2c1e..924e210 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2263,6 +2263,18 @@ M5485HFE_config :	unconfig
>  TASREG_config :		unconfig
>  	@$(MKCONFIG) $(@:_config=) m68k mcf52x2 tasreg esd
>  
> +astro_mcf5373l_config \
> +astro_mcf5373l_ram_config :	unconfig
> +	@if [ "$@" = "astro_mcf5373l_ram_config" ] ; then \
> +		echo "#define CONFIG_MONITOR_IS_IN_RAM"	>> $(obj)include/config.h ; \
> +		echo "TEXT_BASE = 0x40020000" > $(obj)board/astro/mcf5373l/config.tmp ; \
> +		$(XECHO) "... for RAM boot ..." ; \
> +	else \
> +		echo "TEXT_BASE = 0x00000000" > $(obj)board/astro/mcf5373l/config.tmp ; \
> +		$(XECHO) "... for FLASH boot ..." ; \
> +	fi
> +	@$(MKCONFIG) -a astro_mcf5373l m68k mcf532x mcf5373l astro

Please keep lists sorted, and don't add such scripting to the
Makefile. It is not needed any more.

> diff --git a/board/astro/mcf5373l/astro.h b/board/astro/mcf5373l/astro.h
> new file mode 100644
> index 0000000..9478787
> --- /dev/null
> +++ b/board/astro/mcf5373l/astro.h
...
> +typedef struct _s_karten_id {
> +	char Kartentyp;
> +	char Hardwareversion;
> +	char Softwareversion;
> +	char SoftwareSubversion;	/* " ","a",.."z" */
> +	char FPGA_Version_Alt;
> +	char FPGA_Version_Xil;
> +} s_karten_id;

Variable names must be all lower case. Please fix globally.

> +typedef struct {
> +	unsigned char mode;
> +	unsigned char deviation;
> +	unsigned short freq;
> +} __attribute__ ((packed)) s_output_params;

And please decide for one language. Don;t use half german and half
English names. Note that English is striclty preferred.

> diff --git a/board/astro/mcf5373l/fpga.c b/board/astro/mcf5373l/fpga.c
> new file mode 100644
> index 0000000..eb1bf49
> --- /dev/null
> +++ b/board/astro/mcf5373l/fpga.c
...
> +/*
> + * Altera/Xilinx FPGA configuration support for the ASTRO "URMEL" board
> + */
> +
> +#include <common.h>
> +#include <watchdog.h>
> +#include <altera.h>
> +#include <ACEX1K.h>
> +#include <spartan3.h>
> +#include <command.h>
> +#include <asm/immap_5329.h>
> +#include "fpga.h"
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int altera_pre_fn (int cookie)
> +{
> +	volatile gpio_t *gpiop = (volatile gpio_t *)MMAP_GPIO;
> +
> +/* first, set the required pins to GPIO function */

Incorrect indentation. Please fix globally.

> +	/* PAR_T0IN -> GPIO */
> +	gpiop->par_timer &= 0xfc;

Please use I/O accessors to access device registers. Please fix
globally.

> +
> +/* writes the complete buffer to the FPGA
> +   writing the complete buffer in one function is much faster,
> +   then calling it for every bit */

Incorrect multiline comment. Please fix globally.

> +/*
> + * Test the state of the active-low FPGA INIT line.  Return 1 on INIT
> + * asserted (low).
> + */
> +int xilinx_init_fn (int cookie)
> +{
> +	unsigned char state;
> +	volatile gpio_t *gpiop = (volatile gpio_t *)MMAP_GPIO;
> +
> +	state = (gpiop->ppd_pwm & 0x08) >> 3;
> +	if (state)
> +		return 0;
> +	else
> +		return 1;

Simplify:

	return ((gpiop->ppd_pwm & 0x08) != 0);

(but use I/O accessor instead.

> --- /dev/null
> +++ b/board/astro/mcf5373l/mcf5373l.c
...
> +	return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;

Use get_ram_size() ?

> +int testdram (void)
> +{
> +	printf ("DRAM test not implemented!\n");
> +
> +	return (0);
> +}

We already have a number of memory tests. Don't reinvent the wheel.


> +void astro_put_char (char ch)
> +{
> +	volatile uart_t *uart;
> +	int i;
> +
> +	uart = (volatile uart_t *)(MMAP_UART0);
> +	/* Wait for last character to go. */
> +	for (i = 0; (i < 0x10000); i++)
> +		if (uart->usr & UART_USR_TXRDY)
> +			break;

Braces needed for multiline statement. And you probably want to use a
better timeout.

> diff --git a/board/astro/mcf5373l/u-boot.lds b/board/astro/mcf5373l/u-boot.lds
> new file mode 100644
> index 0000000..a9a4e0a
> --- /dev/null
> +++ b/board/astro/mcf5373l/u-boot.lds

Do you really need a board specific linker script?

> diff --git a/board/astro/mcf5373l/update.c b/board/astro/mcf5373l/update.c
> new file mode 100644
> index 0000000..ac57816
> --- /dev/null
> +++ b/board/astro/mcf5373l/update.c
...
> +#define CMD_INIT		0
> +#define CMD_NEW			1
> +#define CMD_TX			2
> +#define CMD_RX			3
> +#define CMD_OK			4
> +#define CMD_FAIL		5
> +#define CMD_CH_RX		6
> +#define CMD_TX_END		7
> +#define CMD_RX_END		8
> +#define CMD_TX_RDY		9
> +#define CMD_RX_RDY		10
> +#define CMD_RX_ERROR		11

Looks as if you wanted to use an enum here?

> +#define	F_Daten_Speichern	 	0x00	/* save parameters on card */
> +#define	F_Daten_Lesen		 	0x01	/* read parameters */
> +#define	F_Karteninfo_Lesen 	 	0x10	/* read 5 Byte card information */
> +#define	F_Kartenfehler_Lesen	 	0x11	/* read 4 Byte card error */
> +#define	F_Transparente_Daten	 	0x20	/* length byte + data */
> +
> +#define SC_Prepare_for_Flash_Data	0xc0
> +#define SC_Flash_Data			0xc1
> +#define SC_Clear_CRC			0xc2
> +#define SC_Check_CRC			0xc3
> +#define SC_Restart			0xc4

Macros use all caps names. And decide for _one_ language.

> +void do_crc (unsigned char data)
> +{

Cool. Yet another CRC function :-(

> +int dez2hex (int in)
> +{
> +	int out;
> +
> +	out = 16 * (in / 10);
> +	out += (in % 10);
> +	return out;
> +}

Get rid of this and use proper conversion routines.

> +	if (flash_prog_stat == FL_STAT_IDLE) {
> +		if (((flash_prog_count & 0x1ffff) == 0) &&
> +		    ((flash_prog_count >> 17) == flash_sect_count)) {
> +			flash_protect (FLAG_PROTECT_CLEAR, fl_adr,
> +					fl_adr + 0x1ffff, flash_info);
> +			s = flash_erase_nb (flash_info, fl_sector);
> +			flash_prog_stat = FL_STAT_ERASE;
> +		}
> +		else if ((flash_data_count >= (flash_prog_count + 64))

Move 'else' on previous line.

> +			   || ((int_command & INT_CMD_WRITE_FLASH)
> +			       && (flash_data_count > flash_prog_count))) {
> +			s = write_buff_nb (flash_info,
> +					   flash_buffer +
> +					   (flash_prog_count & 0xffff),
> +					   fl_adr, 64);
> +			flash_prog_stat = FL_STAT_PROG;
> +		}
> +	}
> +	else if (flash_prog_stat == FL_STAT_ERASE) {

Ditto.

> +		s = flash_full_status_check_nb (flash_info, fl_sector,
> +						0, "erase");
> +		if (s != ERR_BUSY) {
> +			if (s == ERR_OK) {
> +				flash_sect_count++;
> +				flash_prog_stat = FL_STAT_IDLE;
> +			}
> +			else

And again. Please fix indentation globally.

> +		if (s != ERR_BUSY) {
> +			if (s == ERR_OK) {
> +				flash_prog_stat = FL_STAT_IDLE;
> +				for (i = 0; i < 64; i++)
> +					if (flash_buffer
> +					    [(flash_prog_count + i)
> +					     & 0xffff] !=
> +					    *((unsigned char *)fl_adr +
> +					      i))
> +						flash_prog_stat =
> +						    FL_STAT_ERROR;

This looks very much unreadable.

Quoting "Documentation/CodingStyle":

Now, some people will claim that having 8-character indentations makes
the code move too far to the right, and makes it hard to read on a
80-character terminal screen.  The answer to that is that if you need
more than 3 levels of indentation, you're screwed anyway, and should fix 
your program.

> +	if (env_string != NULL) {
> +		i = (int)simple_strtol (env_string, NULL, 10);
> +		Karteninformation.Hardwareversion = dez2hex (i);

Why are you doing this? Why not simply

		Karteninformation.Hardwareversion =
			simple_strtol(env_string, NULL, 16);
?

Also mind that the CodingStyle does not allow for spaces between
function name and '('. Please fix globally.

...
> +			/* set high baud rate */
> +			rs_serial_init (0, 115200);
> +			// Reset the Receive Byte Counter

No C++ comments, please.

> +		if (select) {
> +/***************************************************************************/
> +/**     UART RX Routine                                                   **/
> +/***************************************************************************/

Indentation wrong, incorrect multiline comment. Please fix globally.

...
> +U_BOOT_CMD (update, 2, 1, do_update,
> +	    "update  - update function information\n",
> +	    "\n    - print information for update\n"
> +	    "update N\n    - print information for update # N\n");

Check oif this help message really looks what you think it should look
like. For example, the last '\n' is probably wrong.

> diff --git a/include/configs/astro_mcf5373l.h b/include/configs/astro_mcf5373l.h
> new file mode 100644
> index 0000000..2ce80f8
> --- /dev/null
> +++ b/include/configs/astro_mcf5373l.h
...
> +/* ---
> + * Enable use of Ethernet
> + * ---
> + */
> +
> +/* ethernet could be useful for debugging */
> +/* #define FEC_ENET */

Do not add dead code.

...
> +/* ---
> + * set "#if 0" to "#if 1" if (Hardware)-WATCHDOG should be enabled & change
> + * timeout acc. to your needs
> + * #define CONFIG_WATCHDOG_TIMEOUT x , x is timeout in milliseconds, e. g. 10000
> + * for 10 sec
> + * ---
> + */
> +
> +#ifndef CONFIG_MONITOR_IS_IN_RAM
> +#define CONFIG_WATCHDOG
> +#define CONFIG_WATCHDOG_TIMEOUT 3355	/* timeout in milliseconds */
> +#endif

Which "#if 0" are you referring to in the comment?


> +#define CONFIG_EXTRA_ENV_SETTINGS			\
> +	"loaderversion=11\0"				\
> +	"card_id="QUOTEME(ASTRO_ID)"\0"			\
> +	"alterafile=0\0"				\
> +	"xilinxfile=0\0"				\
> +	"xilinxload=imxtract 0x540000 $xilinxfile 0x41000000&&fpga load 0 0x41000000 $filesize\0" \
> +	"alteraload=imxtract 0x6c0000 $alterafile 0x41000000&&fpga load 1 0x41000000 $filesize\0" \

Lines too long, Please fix globally.

> +#define CONFIG_ETHADDR 00:00:00:00:00:09	/* default ethernet MAC addr. */
> +#define CONFIG_IPADDR 192.168.100.2		/* default board IP address */
> +#define CONFIG_SERVERIP 192.168.100.1	/* default tftp server IP address */

NAK.

Remove these settings, and never ever use bogus or stolen MAC
addresses.


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
If it happens once, it's a bug.
If it happens twice, it's a feature.
If it happens more than twice, it's a design philosophy.


More information about the U-Boot mailing list