Skip to content

Commit

Permalink
Merge pull request #204 from bbonev/s1mtd
Browse files Browse the repository at this point in the history
sync src/mtd_probe/*.[ch]
  • Loading branch information
bbonev authored Oct 16, 2021
2 parents 221549a + d7f9153 commit ffca0bb
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 32 deletions.
6 changes: 5 additions & 1 deletion src/mtd_probe/Makefile.am
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
27 changes: 13 additions & 14 deletions src/mtd_probe/mtd_probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
2 changes: 1 addition & 1 deletion src/mtd_probe/mtd_probe.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
38 changes: 22 additions & 16 deletions src/mtd_probe/probe_smartmedia.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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;
}

0 comments on commit ffca0bb

Please sign in to comment.