i2c device initialization on MVME3100 RTEMS5 (presumably also in 6?)

Heinz Junkes junkes at fhi-berlin.mpg.de
Thu Aug 4 07:47:57 UTC 2022


Hi Chris,
sorry, I had cut that off :-(

It is addressed in a hook (in bspstart.c)

static void mvme3100_i2c_initialize(void)
{
  printk("-------- call BSP_i2c_initialize() with _IO_All_drivers_initialized = true\n");
  /*
   * we need the drivers registered as they appear, due to get
   * the i2c devices ready
   */
  _IO_All_drivers_initialized = true;
  BSP_i2c_initialize();
  _IO_All_drivers_initialized = false;
}

RTEMS_SYSINIT_ITEM(
  mvme3100_i2c_initialize,
  RTEMS_SYSINIT_BSP_PRE_DRIVERS,
  RTEMS_SYSINIT_ORDER_MIDDLE
);

Viele Grüße
Heinz


> On 4. Aug 2022, at 03:31, Chris Johns <chrisj at rtems.org> wrote:
> 
> On 3/8/2022 9:52 pm, Heinz Junkes wrote:
>> We had a problem initialising the i2c devices on the MVME3100.
>> Unfortunately, I still don't understand the order of initialisation.
>> 
>> However, the direct driver initialisation from bspstart no longer worked as it did with older versions. 
>> 
>> My workaround therefore looks like this:
>> 
>> rtems at rtems-dev:~/MVME3100/kernel$ git diff bsps/powerpc/mvme3100/start/bspstart.c
>> diff --git a/bsps/powerpc/mvme3100/start/bspstart.c b/bsps/powerpc/mvme3100/start/bspstart.c
>> index 0ec215e33b..96d6e2f9cd 100644
>> --- a/bsps/powerpc/mvme3100/start/bspstart.c
>> +++ b/bsps/powerpc/mvme3100/start/bspstart.c
>> @@ -52,6 +52,8 @@
>> extern unsigned long __rtems_end[];
>> extern unsigned      ppc_exc_lock_std, ppc_exc_gpr3_std;
>> 
>> +extern bool _IO_All_drivers_initialized;
>> +
>> /*
>>  * Copy Additional boot param passed by boot loader
>>  */
>> @@ -419,7 +421,14 @@ void bsp_start( void )
>> 
>> static void mvme3100_i2c_initialize(void)
>> {
>> +  printk("-------- call BSP_i2c_initialize() with _IO_All_drivers_initialized = true\n");
>> +  /*
>> +   * we need the drivers registered as they appear, due to get
>> +   * the i2c devices ready
>> +   */
>> +  _IO_All_drivers_initialized = true;
>>   BSP_i2c_initialize();
>> +  _IO_All_drivers_initialized = false;
>> }
> 
> Where is this being called? I cannot see it in the patch. If it is BSP start I
> think it is too early to make these calls.
> 
>> RTEMS_SYSINIT_ITEM(
>> 
>> 
>> You can find this in cpukit/sapi/src/ioregisterdriver.c:
>> 
>> 
>> if ( _IO_All_drivers_initialized ) {
>>    /* Other drivers have already been initialized, we initialize
>>     * the driver directly.
>>     */
>>    return rtems_io_initialize( major, 0, NULL );
>>  } else {
>>    /* The driver will be initialized together with all other drivers
>>     * in a later stage by _IO_Initialize_all_drivers().
>>     */
>>    return RTEMS_SUCCESSFUL;
>>  }
>> 
>> 
>> I can imagine that this is not an elegant way, but it's the best I could do. Is there any idea how to do it "right"?
>> Or should I submit this patch?
> I suspect touching that internal variable is not great. That variable could go
> away or be made static.
> 
> There maybe another BSP hook that could be used or a SYSINIT hook maybe be needed.
> 
> Chris



More information about the devel mailing list