Skip to content

e2k-imsprog #161

@DJs3000

Description

@DJs3000

Михаил, приветствую. У меня к вам такой вопрос - просьба. Сначала небольшая предыстория. На Эльбрусе для прошивки ПНС(Программа Начального Старта) по привычному 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;
}

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions