initial commit
This commit is contained in:
commit
85d50ee958
26 files changed
+2146
No files matched your search
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in new issue
Block a user