e2k-imsprog
Михаил, приветствую. У меня к вам такой вопрос - просьба. Сначала небольшая предыстория. На Эльбрусе для прошивки ПНС(Программа Начального Старта) по привычному 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 ! Сейчас пока я не планирую делать консольное обращение к IMSProg. Посмотрите, пожалуйста, в сторону SNANDer и моей статейки про его базу. Есть и скрипт для более удобной работы через Zenity.
P.S. Не пропадайте, пожалуйста, далеко - меня заинтересовал Ваш скрипт.
Боюсь я сам не справлюсь с такой задачей, у меня опыта маловато, но я попробую.
По идеи всё это ровно так же будет работать и на любом х86 компе под линуксом. Хотя нет, на одном своем х86 компе проверил и там нет /dev/spidev т.е. скорее всего нужен драйвер на spi интерфейс и он ещё под каждый чипсет наверное будет отличаться. В целом поизучаю вопрос на счёт х86, но вот на Эльбурсе всегда будет spi интерфейс для работы с флешкой.