Я пытаюсь перенести бит пользовательского пространства raspberrypi кода с C на golang, и я столкнулся с программой, включающей ioctl()
.
У меня проблемы именно со следующим кодом C
#define MAJOR_NUM 100
#define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM, 0, char *)
static int mbox_property(int file_desc, void *buf){
int ret_val = ioctl(file_desc, IOCTL_MBOX_PROPERTY, buf);
return ret_val;
}
, и мой ходовой эквивалент для этого составляет
func mBoxProperty(f *os.File, buf [256]int64) {
err := Ioctl(f.Fd(), IOWR(100, 0, 8), uintptr(unsafe.Pointer(&buf[0])))
if err != nil {
log.Fatalln("mBoxProperty() : ", err)
}
}
func Ioctl(fd, op, arg uintptr) error {
_, _, ep := syscall.Syscall(syscall.SYS_IOCTL, fd, op, arg)
if ep != 0 {
return syscall.Errno(ep)
}
return nil
}
func IOWR(t, nr, size uintptr) uintptr {
return IOC(IocRead|IocWrite, t, nr, size)
}
func IOC(dir, t, nr, size uintptr) uintptr {
return (dir << IocDirshift) | (t << IocTypeshift) | (nr << IocNrshift) | (size << IocSizeshift)
}
, но всякий раз, когда я запускаю это, я получаю invalid argument
ошибка, я думаю, это может быть связано с тем, как я звоню на IOCTL()
, но я не уверен, как я могу это исправить?