【Pixhawk】注册一个字符型驱动设备

来源:互联网 发布:采购流程及优化 编辑:程序博客网 时间:2024/05/22 10:45

最近学习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 */boolstart_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的初始化步骤,以后补充

原创粉丝点击