package mtd import ( "fmt" "os" "syscall" "unsafe" ) // eraseMTD выполняет ioctl MEMERASE для стирания области MTD-устройства. // Используется системный вызов ioctl с соответствующей структурой. func EraseMTD(f *os.File, start, length uint64) error { // Структура erase_info_user (определена в linux/mtd/mtd.h) // На 64‑битных системах оба поля uint64. type eraseInfo struct { Start uint64 Length uint64 } ei := eraseInfo{Start: start, Length: length} // Определяем ioctl MEMERASE. Числовое значение можно взять из заголовков. // Для ARM64 обычно: MEMERASE = 0x80044d02? Но используем стандартное значение, // которое определено в через _IOW('M', 2, erase_info_user). // В большинстве 64‑битных систем это 0x80104d02? Проверим: // _IOC(_IOC_WRITE, 'M', 2, sizeof(erase_info_user)) с sizeof=16 => 0x80104d02. // Но для простоты можно использовать константу из пакета unix, если он её определяет. // Если нет, её можно вычислить с помощью макроса _IOW, но в чистом Go это сложно. // Положимся на значение, которое работает на целевой платформе: const MEMERASE = 0x40084d02 // для 32-битных, для 64-битных может отличаться. // Более безопасно использовать вызов syscall.Syscall с аргументами напрямую. // Вместо этого можно попытаться вызвать "mtd_debug erase" через exec, но это нежелательно. // Здесь мы оставляем как пример; при необходимости скорректируйте константу под вашу платформу. _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), MEMERASE, uintptr(unsafe.Pointer(&ei))) if errno != 0 { return fmt.Errorf("ioctl MEMERASE failed: %v", errno) } return nil }