[U-Boot] M5282EVB undefined reference to `environment'

James Steward
2011-11-24T23:27:46Z

On 24/11/11 17:36, Igor Grinberg wrote:
> On 11/24/11 01:58, James Steward wrote:
>> Hi Igor,
>>
>> On 23/11/11 23:19, Igor Grinberg wrote:
>>> Hi James,
>>>
>>> On 11/22/11 07:22, James Steward wrote:
>>>> On 22/11/11 15:51, Marek Vasut wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I'm trying to build U-Boot for the above mentioned board. Basically,
>>>>>> I've done the following on a Ubuntu 10.04:
>>>>>>
>>>>>> wget
>>>>>> https://sourcery.mentor.com/public/gnu_toolchain/m68k-elf/freescale-coldfir
>>>>>> e-4.4-215-m68k-elf-i686-pc-linux-gnu.tar.bz2
>>>>>>
>>>>>> sudo tar xvfj
>>>>>> freescale-coldfire-4.4-215-m68k-elf-i686-pc-linux-gnu.tar.bz2 -C /opt
>>>>>>
>>>>>> export
>>>>>> PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/free
>>>>>> scale-coldfire-4.4/bin
>>>>>>
>>>>>> |sudo apt-get install git-core
>>>>>>
>>>>>> mkdir /home/james/u-boot-git&& cd ||/home/james/u-boot-git
>>>>>>
>>>>>> git clone ||git://git.denx.de/u-boot-coldfire.git
>>>>>>
>>>>>> ||cd u-boot-coldfire
>>>>>> ||
>>>>>> ||make clean
>>>>>>
>>>>>> make M5282EVB_config
>>>>>
>>>>> try ./MAKEALL M5282EVB ... I suspect you don't have CROSS_COMPILE=your-crosscc-
>>>>> prefix variable set, and maybe ARCH=m68k variable too.
>>>>
>>>> I didn't have those env vars set, however now with them set, and the latest codesourcery compiler I get the same error;
>>>>
>>>> export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/freescale-coldfire-2011.09/bin
>>>>
>>>> export CROSS_COMPILE=m68k-elf-
>>>>
>>>> export ARCH=m68k
>>>>
>>>> ./MAKEALL M5282EVB
>>>> Configuring for M5282EVB board...
>>>> cmd_nvedit.c: In function 'do_env_export':
>>>> cmd_nvedit.c:748:3: warning: format '%zX' expects argument of type 'size_t', but argument 3 has type 'unsigned int' [-Wformat]
>>>> cmd_nvedit.c:774:2: warning: format '%zX' expects argument of type 'size_t', but argument 3 has type 'unsigned int' [-Wformat]
>>>> cmd_nvedit.c: In function 'do_env_import':
>>>> cmd_nvedit.c:865:3: warning: format '%zd' expects argument of type 'signed size_t', but argument 2 has type 'size_t' [-Wformat]
>>>> cmd_nvedit.c:865:3: warning: format '%zX' expects argument of type 'size_t', but argument 3 has type 'unsigned int' [-Wformat]
>>>> mcfmii.c: In function 'mcffec_miiphy_write':
>>>> mcfmii.c:318:8: warning: variable 'rdreg' set but not used [-Wunused-but-set-variable]
>>>> common/libcommon.o:(.data.rel.env_ptr+0x0): undefined reference to `environment'
>>>> make: *** [u-boot] Error 1
>>>> m68k-elf-size: './u-boot': No such file
>>>>
>>>> --------------------- SUMMARY ----------------------------
>>>> Boards compiled: 1
>>>> Boards with warnings or errors: 1 ( M5282EVB )
>>>> ----------------------------------------------------------
>>>>
>>>> Any other thoughts? Do I need to define something to configure the environment to flash or something?
>>>
>>> Do you have CONFIG_ENV_IS_EMBEDDED set?
>>>
>>>
>>
>> A search with grep CONFIG_ENV_IS_EMBEDDED `find . -name "*.h"` indicates the answer is no. Should it be set?
>
> AFAIK, environment variable is used only when you have ENV_IS_EMBEDDED set.
> Also, there is some logic in the include/environment.h files
> (in current master line 64), that decides whether to set this
> automatically or not.
>
>>
>> With grep CONFIG_ENV_IS_ `find . -name "*.h"` in include/configs/M5282EVB.h, I see #define CONFIG_ENV_IS_IN_FLASH 1
>>
>> So looking in that file I see:
>>
>> /* Configuration for environment
>> * Environment is embedded in u-boot in the second sector of the flash
>> */
>> #define CONFIG_ENV_ADDR 0xffe04000
>> #define CONFIG_ENV_SIZE 0x2000
>> #define CONFIG_ENV_IS_IN_FLASH 1
>
> Look at the logic in environment.h to check if ENV_IS_EMBEDDED
> gets set in your case.

Indeed...

# if (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) && \
(CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) <= (CONFIG_SYS_MONITOR_BASE +
CONFIG_SYS_MONITOR_LEN)
# define ENV_IS_EMBEDDED 1
#error "Defining ENV_IS_EMBEDDED"
# endif

produces

include/environment.h:66:2: error: #error "Defining ENV_IS_EMBEDDED"

So this is saying that if the environment exists within the flash space
allocated to u-boot, make it so embedded. Ok, fine, so in
common/env_flash.c I see;

#ifdef ENV_IS_EMBEDDED
env_t *env_ptr = &environment;

static env_t *flash_addr = (env_t *)CONFIG_ENV_ADDR;

#else /* ! ENV_IS_EMBEDDED */

I guess the variable environment is not defined, but where should it be
defined? There are a lot of hits when I search.

>>
>> This is pure unadulterated coldfire git source that will not build out of the box. I assumed I was doing something wrong. But it seems there is really a bug in the default configuration for this board?
>
> Could be... It is extremely hard to understand what's going on
> when the source code is a kind of divergence from upstream.
> Also, there is a possibility that ENV_IS_EMBEDDED is broken
> for some time already.
>
>

Ok, I just grabbed u-boot.git instead and ...

common/libcommon.o:(.data.rel.env_ptr+0x0): undefined reference to
`environment'

Where do I look next?

General remark and question:

After building a multitude of open source projects for x86 and cross
compiling for ARM, including cross compiling the Linux kernel and
writing some simple kernel drivers, and writing bare metal code for the
likes of the STM32 and including CanFestival, for example, U-boot has
been the most frustrating and difficult project for me to build and make
work of all. Is it because there are too many board ports contributed
but not maintained?

Regards,
James.