initial commit

This commit is contained in:
wt committed 2026-03-19 14:07:10 +07:00
commit 85d50ee958
26 files changed
+2146

No files matched your search

+39
View File
@@ -0,0 +1,39 @@
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 = 0x80044d02 // для 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
}
+23
View File
@@ -0,0 +1,23 @@
package mtd
import (
"fmt"
"os"
"strconv"
"strings"
)
func ReadMTDSize(devIndex int) (uint64, error) {
path := fmt.Sprintf("/sys/class/mtd/mtd%d/size", devIndex)
data, err := os.ReadFile(path)
if err != nil {
return 0, err
}
// Файл содержит размер в байтах как строку (например, "16777216\n")
sizeStr := strings.TrimSpace(string(data))
size, err := strconv.ParseUint(sizeStr, 10, 64)
if err != nil {
return 0, fmt.Errorf("parsing size from %s: %w", path, err)
}
return size, nil
}