[U-Boot-Users] [PATCH 2/5] Support LATTICE FPGA parts using JTAG programming.

Wolfgang Denk wd at denx.de
Wed Nov 29 22:55:26 CET 2006


Dear Pantelis,

in message <20061129172539.24638.52486.stgit at pantathon.hol.gr> you wrote:
> 
>     Add support for Lattice FPGA parts programmed using JTAG.

Again, the previous comments on necessary coding style cleanup apply.

Also:

>  common/Makefile            |    4 
>  common/ec.c                |  473 ++++++
^^^^^^^^^^^^^^

Huh? What's "ec"? Please use a more descriptive name.

> --- /dev/null
> +++ b/common/lattice_ivm_core.c
...
> +* JTAG state machine transistion tragetory table.

Please fix typos ;-)

> +struct {
> +	unsigned char CurState;	/* From this state */
> +	unsigned char NextState;	/* Step to this state */
> +	unsigned char Pattern;	/* The tragetory of TMS */
> +	unsigned char Pulses;	/* The number of steps */
> +} g_JTAGTransistions[24] = {
> +	{
> +	RESET, RESET, 0xFC, 6},	/* Transitions from RESET */
> +	{
> +	RESET, IDLE, 0x00, 1}, {
> +	RESET, DRPAUSE, 0x50, 5}, {
> +	RESET, IRPAUSE, 0x68, 6}, {
> +	IDLE, RESET, 0xE0, 3},	/* Transitions from IDLE */
> +	{
> +	IDLE, DRPAUSE, 0xA0, 4}, {
> +	IDLE, IRPAUSE, 0xD0, 5}, {
> +	DRPAUSE, RESET, 0xF8, 5},	/* Transitions from DRPAUSE */
> +	{
> +	DRPAUSE, IDLE, 0xC0, 3}, {
> +	DRPAUSE, IRPAUSE, 0xF4, 7}, {
> +	IRPAUSE, RESET, 0xF8, 5},	/* Transitions from IRPAUSE */
> +	{
> +	IRPAUSE, IDLE, 0xC0, 3}, {
> +	IRPAUSE, DRPAUSE, 0xE8, 6}, {
> +	DRPAUSE, SHIFTDR, 0x80, 2},	/* Extra transitions using SHIFTDR */
> +	{
> +	IRPAUSE, SHIFTDR, 0xE0, 5}, {
> +	SHIFTDR, DRPAUSE, 0x80, 2}, {
> +	SHIFTDR, IDLE, 0xC0, 3}, {
> +	IRPAUSE, SHIFTIR, 0x80, 2},	/* Extra transitions using SHIFTIR */
> +	{
> +	SHIFTIR, IRPAUSE, 0x80, 2}, {
> +	SHIFTIR, IDLE, 0xC0, 3}, {
> +	DRPAUSE, DRCAPTURE, 0xE0, 4},	/* 11/15/05 Nguyen changed to support DRCAPTURE */
> +	{
> +	DRCAPTURE, DRPAUSE, 0x80, 2}, {
> +	IDLE, DRCAPTURE, 0x80, 2}, {
> +	IRPAUSE, DRCAPTURE, 0xE0, 4}
> +};

Please fix indentation.

> +#ifdef VME_DEBUG
> +/***************************************************************
> +*
> +* vme_print
> +*
> +* Prints VME to SVF file or terminal, depending on the
> +* pre-compiler definitions. This function may be compiler or OS
> +* specific. Please see your compiler's documentation regarding
> +* va_list, va_arg, and va_end.
> +*
> +***************************************************************/

Is this really needed?

> +void vme_print(const char *a_pszString, ...)
> +{
> +	va_list list;
> +	unsigned short usStringIndex;
> +	static char szString[5000] = { 0 };
> +	static char szTempString[5000] = { 0 };

Do you really need static stings here? 

> +	va_start(list, a_pszString);
> +	for (usStringIndex = 0; usStringIndex < strlen(a_pszString);
> +	     usStringIndex++) {
> +		if (a_pszString[usStringIndex] == '%') {
> +			szString[strlen(szString)] = a_pszString[usStringIndex];
> +			usStringIndex++;

Please note that the variable names are basicly a  violation  of  the
Coding Style (see Chapter 4: Naming). This code, even though it's not
really complicated, is more or less unreadable as is.

...
> +signed char ispVMRead(unsigned short a_usiDataSize)
...
> +	for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize;
> +	     usDataSizeIndex++) {
> +		if (cByteIndex == 0) {
> +
> +	    /***************************************************************
> +             *
> +             * Grab byte from TDO buffer.
> +             *
> +             ***************************************************************/
> +
> +			if (g_usDataType & TDO_DATA) {
> +				cDataByte = g_pucOutData[usBufferIndex];
> +			}
> +
> +	    /***************************************************************
> +             *
> +             * Grab byte from MASK buffer.
> +             *
> +             ***************************************************************/

Comments don't line up here and elsewhere.

> +/***************************************************************
> +*
> +* internal_udelay
> +*
> +* Users must devise their own timing procedure to ensure the
> +* specified minimum delay is observed when using different
> +* platform. The timing function used here is for PC only by
> +* hocking the clock chip.
> +*
> +***************************************************************/
> +
> +void internal_udelay(unsigned short a_usMicroSecondDelay)
> +{
> +	int i, msecs;
> +
> +	if (a_usMicroSecondDelay & 0x8000) {
> +		msecs = a_usMicroSecondDelay & ~0x8000;
> +		for (i = 0; i < msecs; i++)
> +			udelay(1000);
> +		return;
> +	}
> +
> +	udelay(a_usMicroSecondDelay);
> +}

Comment and implementation don't match. Also: are you  sure  this  is
needed in U-Boot?



Best regards,

Wolfgang Denk

-- 
Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"The great question... which I have not been able  to  answer...  is,
`What does woman want?'"                              - Sigmund Freud




More information about the U-Boot mailing list