40 lines
2.2 KiB
Go
40 lines
2.2 KiB
Go
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? Но используем стандартное значение,
|
||
// которое определено в <linux/mtd/mtd.h> через _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
|
||
}
|