最近学习Pixhawk的SPI,本以为PX4是STM32单片机而已, 写个SPI驱动应该很简单。但是当我看到mpu9250的那些cpp文件,我一下就蒙了。由于PX4用的NUTTX系统,类似Linux,所以一切都不是裸代码,操作寄存器那么单纯。它还封装了文件系统的概念。哎。。。不懂C++, 不懂Linux, 只有慢慢啃吧!!!!
先从大神的一篇博客入门:
《Pixhawk原生固件PX4之MPU6000驱动分析》
http://blog.csdn.net/oqqENvY12/article/details/70039527
相信看完之后还是不知所以然,其实实现字符型设备注册的过程就是在mpu6000.cpp 里的(MPU6000_SPI.CPP其实是初始化总线的)
/**
* start driver for a specific bus option
*/
bool
start_bus(struct mpu6000_bus_option &bus, enum Rotation rotation, int range, int device_type)
{
int fd = -1;
if (bus.dev != nullptr) {
warnx("%s SPI not available", bus.external ? "External" : "Internal");
return false;
}
device::Device *interface = bus.interface_constructor(bus.busnum, device_type, bus.external); //SPI总线实例化
if (interface == nullptr) {
warnx("no device on bus %u", (unsigned)bus.busid);
return false;
}
if (interface->init() != OK) { //这里初始化SPI总线,和文件系统无关,先不理会
delete interface;
warnx("no device on bus %u", (unsigned)bus.busid);
return false;
}
bus.dev = new MPU6000(interface, bus.accelpath, bus.gyropath, rotation, device_type); //这里才是和文件系统相关的
if (bus.dev == nullptr) {
delete interface;
return false;
}
if (OK != bus.dev->init()) { //这里其实是调用CDev::init() 这个函数实现字符型驱动注册,需要3个参数,名称“MPU6000”,路径“/dev/mpu6000_accel”(可以在//nsh>cd dev 看到),"irq 不懂干什么,实际也没有 赋值"(字面意思是中断)
goto fail;
}
/* set the poll rate to default, starts automatic data collection */
fd = open(bus.accelpath, O_RDONLY);//注册驱动之后,可以调用open()打开驱动,fd是这个文件的句柄。Linux里 设备=文件 。。。
if (fd < 0) {
goto fail;
}
if (ioctl(fd, SENSORIOCSPOLLRATE, SENSOR_POLLRATE_DEFAULT) < 0) { //之后可以进行ioctl() read() write() 等操作,为什么??因为注册驱动 的时候,已经将fd的句//柄和MPU6000::ioctl MPU6000::read MPU6000::write(C++ 这些函数是重写基类CDev //的) 所以这里其实等价于 bus.dev->ioctl(.....)
goto fail;
}
if (ioctl(fd, ACCELIOCSRANGE, range) < 0) {
goto fail;
}
close(fd);
return true;
fail:
if (fd >= 0) {
close(fd);
}
if (bus.dev != nullptr) {
delete bus.dev;
bus.dev = nullptr;
}
return false;
}
//如果不懂C++,按照C的思维是看不明的,主要是类的继承,类成员函数的重写,覆盖,动态绑定需要知道
//以上写的比较乱
>>>>>>>>>>>>>接下来记录SPI的初始化步骤,以后补充
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)