Files
up_go/utils/mtd/EraseMTD.go
T

40 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}