mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-11-23 23:10:57 +07:00
commit
ffca0bbd31
@ -1,7 +1,7 @@
|
||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I $(top_srcdir)/src/shared
|
||||
-I $(top_srcdir)/src/shared
|
||||
|
||||
udevlibexec_PROGRAMS = \
|
||||
mtd_probe
|
||||
@ -10,3 +10,7 @@ mtd_probe_SOURCES = \
|
||||
mtd_probe.c \
|
||||
mtd_probe.h \
|
||||
probe_smartmedia.c
|
||||
|
||||
mtd_probe_LDADD = \
|
||||
$(top_builddir)/src/libudev/libudev-private.la \
|
||||
$(top_builddir)/src/udev/libudev-core.la
|
||||
|
@ -31,29 +31,28 @@
|
||||
#include <stdlib.h>
|
||||
#include "mtd_probe.h"
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int mtd_fd;
|
||||
int error;
|
||||
int main(int argc, char** argv) {
|
||||
int mtd_fd = -1;
|
||||
mtd_info_t mtd_info;
|
||||
|
||||
if (argc != 2) {
|
||||
printf("usage: mtd_probe /dev/mtd[n]\n");
|
||||
return 1;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
mtd_fd = open(argv[1], O_RDONLY|O_CLOEXEC);
|
||||
if (mtd_fd == -1) {
|
||||
perror("open");
|
||||
exit(-1);
|
||||
if (mtd_fd < 0) {
|
||||
log_error_errno(errno, "Failed to open: %m");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
error = ioctl(mtd_fd, MEMGETINFO, &mtd_info);
|
||||
if (error == -1) {
|
||||
perror("ioctl");
|
||||
exit(-1);
|
||||
if (ioctl(mtd_fd, MEMGETINFO, &mtd_info) < 0) {
|
||||
log_error_errno(errno, "Failed to issue MEMGETINFO ioctl: %m");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
probe_smart_media(mtd_fd, &mtd_info);
|
||||
return -1;
|
||||
if (probe_smart_media(mtd_fd, &mtd_info) < 0)
|
||||
return EXIT_FAILURE;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
@ -48,4 +48,4 @@ struct sm_oob {
|
||||
#define SM_SMALL_PAGE 256
|
||||
#define SM_SMALL_OOB_SIZE 8
|
||||
|
||||
void probe_smart_media(int mtd_fd, mtd_info_t *info);
|
||||
int probe_smart_media(int mtd_fd, mtd_info_t *info);
|
||||
|
@ -32,29 +32,32 @@ static const uint8_t cis_signature[] = {
|
||||
0x01, 0x03, 0xD9, 0x01, 0xFF, 0x18, 0x02, 0xDF, 0x01, 0x20
|
||||
};
|
||||
|
||||
|
||||
void probe_smart_media(int mtd_fd, mtd_info_t* info)
|
||||
{
|
||||
int probe_smart_media(int mtd_fd, mtd_info_t* info) {
|
||||
int sector_size;
|
||||
int block_size;
|
||||
int size_in_megs;
|
||||
int spare_count;
|
||||
char* cis_buffer = malloc(SM_SECTOR_SIZE);
|
||||
uint8_t *cis_buffer = NULL;
|
||||
int offset;
|
||||
int cis_found = 0;
|
||||
|
||||
cis_buffer = malloc(SM_SECTOR_SIZE);
|
||||
if (!cis_buffer)
|
||||
return;
|
||||
return log_oom();
|
||||
|
||||
if (info->type != MTD_NANDFLASH)
|
||||
if (info->type != MTD_NANDFLASH) {
|
||||
log_debug("Not marked MTD_NANDFLASH.");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
sector_size = info->writesize;
|
||||
block_size = info->erasesize;
|
||||
size_in_megs = info->size / (1024 * 1024);
|
||||
|
||||
if (sector_size != SM_SECTOR_SIZE && sector_size != SM_SMALL_PAGE)
|
||||
if (!IN_SET(sector_size, SM_SECTOR_SIZE, SM_SMALL_PAGE)) {
|
||||
log_debug("Unexpected sector size: %i", sector_size);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
switch(size_in_megs) {
|
||||
case 1:
|
||||
@ -69,27 +72,30 @@ void probe_smart_media(int mtd_fd, mtd_info_t* info)
|
||||
break;
|
||||
}
|
||||
|
||||
for (offset = 0 ; offset < block_size * spare_count ;
|
||||
offset += sector_size) {
|
||||
lseek(mtd_fd, SEEK_SET, offset);
|
||||
if (read(mtd_fd, cis_buffer, SM_SECTOR_SIZE) == SM_SECTOR_SIZE){
|
||||
for (offset = 0; offset < block_size * spare_count; offset += sector_size) {
|
||||
(void) lseek(mtd_fd, SEEK_SET, offset);
|
||||
|
||||
if (read(mtd_fd, cis_buffer, SM_SECTOR_SIZE) == SM_SECTOR_SIZE) {
|
||||
cis_found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cis_found)
|
||||
if (!cis_found) {
|
||||
log_debug("CIS not found");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (memcmp(cis_buffer, cis_signature, sizeof(cis_signature)) != 0 &&
|
||||
(memcmp(cis_buffer + SM_SMALL_PAGE, cis_signature,
|
||||
sizeof(cis_signature)) != 0))
|
||||
memcmp(cis_buffer + SM_SMALL_PAGE, cis_signature, sizeof(cis_signature)) != 0) {
|
||||
log_debug("CIS signature didn't match");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
printf("MTD_FTL=smartmedia\n");
|
||||
free(cis_buffer);
|
||||
exit(0);
|
||||
return 0;
|
||||
exit:
|
||||
free(cis_buffer);
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user