IMSProg icon indicating copy to clipboard operation
IMSProg copied to clipboard

e2k-imsprog

Open DJs3000 opened this issue 1 month ago • 3 comments

Михаил, приветствую. У меня к вам такой вопрос - просьба. Сначала небольшая предыстория. На Эльбрусе для прошивки ПНС(Программа Начального Старта) по привычному bios на материнской плате, используется sh скрипт, как надстройка над flashrom. Всё бы хорошо, но детект типа флешки через RDID(jedec id) работает в flashrom через одно место и база там обновляется, как-то странно. Из-за этого при прошивке ПНС скрипт даёт на выбор от 2 и парой до 10+ вариантов флешек перед прошивкой т.к. flashrom именно так это детектит. На материнки ставится исключительно 25 серия, которая должна хорошо определиться и когда я шью программатором внутрисхемно при помощи вашего IMSProg, то флешка всегда определяется корректно. Вот я подумал, что было бы круто на базе IMSProg сделать прошиватель консольный или графический, а может и такой и такой, и чтоб он обновлял базу микросхем ровно так же. Я попробовал написать детект на С и оно отлично детектит jedec id:

Мой пример кода детекта флешки
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <linux/types.h>
#include <linux/ioctl.h>
#include <linux/spi/spidev.h>
#include <sys/ioctl.h>

uint32_t
read_id (int fd)
{
  int iocontrol_code;
  unsigned char id[3];
  unsigned char cmd = { 0x9F };
  struct spi_ioc_transfer msg[2] = {
    {
     .tx_buf = (uint64_t) (uintptr_t) & cmd,
     .len = 1,
     },
    {
     .rx_buf = (uint64_t) (uintptr_t) id,
     .len = sizeof (id),
     },
  };

  if (ioctl (fd, SPI_IOC_MESSAGE (2), msg) == -1)
    {
      perror ("spi_ioc_message(2)");
      return -1;
    }

  return id[2] | (id[1] << 8) | (id[0] << 16);
}

int
main ()
{
  const uint32_t speed = 25000000;
  const uint8_t mode = SPI_MODE_0;
  const uint8_t bits = 8;
  int fd = -1;

  fd = open ("/dev/spidev0.0", O_RDWR);
  if (fd == -1)
    {
      perror ("open spidev");
      return 1;
    }

  if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1)
    {
      perror ("ioctl(SPI_IOC_WR_MAX_SPEED_HZ");
      return 1;
    }

  if (ioctl (fd, SPI_IOC_WR_MODE, &mode) == -1)
    {
      perror ("ioctl(SPI_IOC_WR_MODE)");
      return 1;
    }

  if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &bits) == -1)
    {
      perror ("ioctl(SPI_IOC_WR_BITS_PER_WORD");
      return 1;
    }

  printf ("%06x\n", read_id (fd));

  close (fd);

  return 0;
}

Возможно вам будет интересно помочь с этим :)

DJs3000 avatar Nov 24 '25 09:11 DJs3000

Добрый день, @DJs3000 ! Сейчас пока я не планирую делать консольное обращение к IMSProg. Посмотрите, пожалуйста, в сторону SNANDer и моей статейки про его базу. Есть и скрипт для более удобной работы через Zenity.

P.S. Не пропадайте, пожалуйста, далеко - меня заинтересовал Ваш скрипт.

bigbigmdm avatar Nov 24 '25 11:11 bigbigmdm

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

DJs3000 avatar Nov 24 '25 12:11 DJs3000

По идеи всё это ровно так же будет работать и на любом х86 компе под линуксом. Хотя нет, на одном своем х86 компе проверил и там нет /dev/spidev т.е. скорее всего нужен драйвер на spi интерфейс и он ещё под каждый чипсет наверное будет отличаться. В целом поизучаю вопрос на счёт х86, но вот на Эльбурсе всегда будет spi интерфейс для работы с флешкой.

DJs3000 avatar Nov 24 '25 12:11 DJs3000