-
Notifications
You must be signed in to change notification settings - Fork 83
Description
Михаил, приветствую. У меня к вам такой вопрос - просьба. Сначала небольшая предыстория. На Эльбрусе для прошивки ПНС(Программа Начального Старта) по привычному 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;
}
Возможно вам будет интересно помочь с этим :)