Почему происходит сбой загрузчика, когда я использую операцию чтения/записи i2c в uefi на платформе Qualcomm qcs?

Я могу прямо сейчас управлять gpio в uefi, поэтому нет проблем с тем, что я могу управлять физическим уровнем. Между тем, удалось открыть I2C_instance через. квалкомм I2cApiLib. Но когда я использую I2C_read/write в своем коде, загрузчик падает при загрузке.

Журнал сбоев выглядит следующим образом:

введите здесь описание изображения

Образец кода:

EFI_STATUS
EFIAPI
BootLEDMain(IN EFI_HANDLE ImageHandle,
        IN EFI_SYSTEM_TABLE *SystemTable)
{
  DEBUG((EFI_D_ERROR, "------BootLED APPLICATION TEST------\n"));

  i2c_status istatus = I2C_SUCCESS;

  VOID      *i2c_handle      = NULL;
  UINT32    bytes_read       = 0;
  uint8     readbuf          = 0;
  //UINT32    bytes_written    = 0;
  //uint8     writebuf         = 0x01;

  i2c_config cfg;
  cfg.bus_frequency_khz = 400;
  cfg.slave_address = 0x77;
  cfg.slave_address_type = I2C_07_BIT_SLAVE_ADDRESS;

  istatus = i2c_open((i2c_instance) (I2C_INSTANCE_003), &i2c_handle);
  if (I2C_SUCCESS != istatus)
  {
    DEBUG((EFI_D_ERROR, "Failed to initialize I2C %d\n", istatus));
    goto error;
  }
  else
  {
    DEBUG((EFI_D_ERROR, "Succeed to open I2C\n"));
  }

  istatus = i2c_read (i2c_handle, &cfg, 0x45, 1, &readbuf, 1, &bytes_read, 2500);
  if (I2C_SUCCESS != istatus)
  {
    DEBUG((EFI_D_ERROR, "Read Failed %d\n", (uint32) istatus));
    goto error;
  }
  else
  {
    DEBUG((EFI_D_ERROR, "Succeed to Read\n"));
  }
      .
      .
      .

Не могли бы вы, ребята, которые немного разбираются в qualcomm uefi, объяснить причину, спасибо. Прокомментируйте, какие детали вам, ребята, нужны или вы хотите знать.


person HokyGUAN    schedule 24.07.2020    source источник


Ответы (1)


Из вашего журнала сбоев в реестре синдрома исключения (ESR) говорится, что вы получаете «ошибку перевода, уровень 3» из инструкции, пытающейся записать в местоположение.

Регистр адреса сбоя (FAR) говорит, что адрес сбоя 0x078b700c.

Я понятия не имею, над какой кодовой базой вы работаете, но, по-видимому, вам придется убедиться, что сопоставления MMU созданы для контроллера i2c.

person unixsmurf    schedule 24.07.2020