1
0
Fork 0

Reverts bad change to mtd-rw

This commit is contained in:
Shawn Nock 2020-01-13 14:04:28 -05:00
parent 338403add5
commit 128db44757
3 changed files with 23 additions and 18 deletions

View File

@ -10,25 +10,30 @@ pub fn main() !u8 {
try mtd_rw.load(); try mtd_rw.load();
defer mtd_rw.unload(); defer mtd_rw.unload();
try mtd.ensure_size("mtd0", uboot_bin.len); const mtd_dev = "/dev/mtd0";
const no_write_needed = try mtd.verify("/dev/mtd0", uboot_bin); // Ensure the partition is large enough to hold the new data
try mtd.ensure_size(mtd_dev, uboot_bin.len);
// Bail if the partition matches our payload already
const no_write_needed = try mtd.verify(mtd_dev, uboot_bin);
if (no_write_needed) { if (no_write_needed) {
std.debug.warn("U-Boot is up to date. Exiting.\n", .{}); std.debug.warn("U-Boot is up to date. Exiting.\n", .{});
return 0; return 0;
} }
// Erase and Write
try mtd.erase_device(mtd_dev);
std.debug.warn("Writing {} bytes to {}\n", .{uboot_bin.len, mtd_dev});
try mtd.write_device(mtd_dev, uboot_bin);
try mtd.erase_device("/dev/mtd0"); // Verify
std.debug.warn("Writing {} bytes to /dev/mtd0\n", .{uboot_bin.len}); const writing_verified = try mtd.verify(mtd_dev, uboot_bin);
try mtd.write_device("/dev/mtd0", uboot_bin);
// Verify mtd0
const writing_verified = try mtd.verify("/dev/mtd0", uboot_bin);
if (!writing_verified) { if (!writing_verified) {
std.debug.warn("Verify Failed!\n", .{}); std.debug.warn("Verify Failed!\n", .{});
return 2; return 2;
} }
std.debug.warn("Success\n", .{}); std.debug.warn("Success\n", .{});
return 0; return 0;
} }

View File

@ -13,7 +13,6 @@ const InitModuleError = error {
AlreadyLoaded, AlreadyLoaded,
BadParams, BadParams,
InvalidModule, InvalidModule,
}; };
const DeleteModuleError = error { const DeleteModuleError = error {
@ -37,7 +36,7 @@ pub fn unload() void {
pub fn insmod(buf: []const u8, args: [*:0]const u8) !void { pub fn insmod(buf: []const u8, args: [*:0]const u8) !void {
const errno = os.linux.getErrno( const errno = os.linux.getErrno(
os.linux.syscall3( os.linux.syscall3(
os.linux.SYS_init_module, @ptrToInt(&buf), buf.len, @ptrToInt(args))); os.linux.SYS_init_module, @ptrToInt(&buf[0]), buf.len, @ptrToInt(args)));
switch (errno) { switch (errno) {
0 => return, 0 => return,
os.EEXIST => return, // Module already loaded, this is fine os.EEXIST => return, // Module already loaded, this is fine

View File

@ -8,9 +8,10 @@ const Allocator = std.heap.c_allocator;
const MEMUNLOCK = 2148027654; const MEMUNLOCK = 2148027654;
const MEMERASE = 2148027650; const MEMERASE = 2148027650;
pub fn mtd_info_get(name: []const u8, out: []u8) !void { pub fn mtd_info_get(dev: []const u8, name: []const u8, out: []u8) !void {
const nonabs = dev[5..];
var path_buf: [64]u8 = undefined; var path_buf: [64]u8 = undefined;
const path = try std.fmt.bufPrint(path_buf[0..], "{}/{}", .{"/sys/class/mtd/mtd0/", name}); const path = try std.fmt.bufPrint(path_buf[0..], "{}/{}/{}", .{"/sys/class/mtd", nonabs, name});
var f = try std.fs.openFileAbsolute(path, .{.read = true}); var f = try std.fs.openFileAbsolute(path, .{.read = true});
defer f.close(); defer f.close();
@ -18,10 +19,10 @@ pub fn mtd_info_get(name: []const u8, out: []u8) !void {
out = out[0..num_read-1]; out = out[0..num_read-1];
} }
pub fn mtd_info_get_usize(name: []const u8) !usize { pub fn mtd_info_get_usize(dev: []const u8, name: []const u8) !usize {
var buf: [64]u8 = undefined; var buf: [64]u8 = undefined;
var buf_sl = buf[0..]; var buf_sl = buf[0..];
try mtd_info_get(name, buf_sl); try mtd_info_get(dev, name, buf_sl);
return try std.fmt.parseUnsigned(usize, buf_sl, 10); return try std.fmt.parseUnsigned(usize, buf_sl, 10);
} }
@ -57,7 +58,7 @@ const MtdError = error {
}; };
pub fn ensure_size(dev: []const u8, size: usize) !void { pub fn ensure_size(dev: []const u8, size: usize) !void {
const part_size = try mtd_info_get_usize("size"); const part_size = try mtd_info_get_usize(dev, "size");
if (size > part_size) { if (size > part_size) {
std.debug.warn("Error: {} isn\'t large enough to hold the new image ({} > {})\n", std.debug.warn("Error: {} isn\'t large enough to hold the new image ({} > {})\n",
.{dev, size, part_size}); .{dev, size, part_size});
@ -72,8 +73,8 @@ pub fn write_device(dev: []const u8, buf: []const u8) !void {
} }
pub fn erase_device(dev: []const u8) !void { pub fn erase_device(dev: []const u8) !void {
const erasesize = try mtd_info_get_usize("erasesize"); const erasesize = try mtd_info_get_usize(dev, "erasesize");
const size = try mtd_info_get_usize("size"); const size = try mtd_info_get_usize(dev, "size");
var erased: usize = 0; var erased: usize = 0;
const fd = try os.open(dev, os.O_RDWR, 0); const fd = try os.open(dev, os.O_RDWR, 0);
defer os.close(fd); defer os.close(fd);
@ -92,7 +93,7 @@ pub fn erase_page(fd: os.fd_t, start: usize, len: usize) !void {
} }
pub fn verify(dev: []const u8, buf: []const u8) !bool { pub fn verify(dev: []const u8, buf: []const u8) !bool {
const size = try mtd_info_get_usize("size"); const size = try mtd_info_get_usize(dev, "size");
var current = try Allocator.alloc(u8, size); var current = try Allocator.alloc(u8, size);
var f = try std.fs.openFileAbsolute(dev, .{.read = true}); var f = try std.fs.openFileAbsolute(dev, .{.read = true});