[U-Boot-Users] [PATCH 2/5] Support LATTICE FPGA parts using JTAG programming.
Pantelis Antoniou
pantelis.antoniou at gmail.com
Wed Nov 29 23:08:23 CET 2006
On 29 Νοε 2006, at 11:55 ΜΜ, Wolfgang Denk wrote:
> 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.
>
EC is the family name for the parts - follows the convention by the
virtex & spartan families.
>> --- /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?
>
>
>
As a general comment, this is the same file that RedBoot uses - it's
lattice code,
so I didn't do much with it. Yes the formatting is pretty horrible.
And the comments are pretty misleading.
It is needed, the kernel expects the FPGA to be already programmed &
ready to
go, there is no code to handle FPGA loading in the kernel.
The whole point of this is to have u-boot to be a drop in replacement
for RedBoot,
providing backwards compatibility with kernels & images created for
RedBoot.
> 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
Regards
Pantelis
More information about the U-Boot
mailing list