事实上,另一个问题确实有一种技巧,可以解决我想要解决的问题。请注意,这不是一个通用的Linux解决方案,它只适用于BeagleBone Black和类似设备。(我在BeagleBone Green上测试)从
devmem2
例如,此C++代码块关闭USB电源,然后重新打开:
const size_t page_size_in_bytes = getpagesize();
const size_t address_gpio3_13 = 0x47401c60; // see comment below
const size_t address_start = address_gpio3_13 / page_size_in_bytes * page_size_in_bytes;
const size_t address_offset = address_gpio3_13 - address_start;
int fd = open("/dev/mem", O_RDWR);
void *addr = mmap( 0, page_size_in_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, address_start );
uint8_t *byte_ptr = reinterpret_cast<uint8_t*>(addr);
byte_ptr[address_offset] = 0x00; // turn off USB
std::this_thread::sleep_for( std::chrono::milliseconds(500) );
byte_ptr[address_offset] = 0x01; // turn on USB
munmap( addr, page_size_in_bytes );
close(fd);
(不包括错误处理。)
神奇的数字
0x47401c60
真的是一个神奇的数字。根据一些帖子,似乎需要签署NDA才能访问一些USB相关文档。在《ARM335X技术参考手册》中,第156页仅提及0x47401Cxx地址空间:
Block Name Start Address End Address
USB1 Core 0x4740_1C00 0x4740_1FFF