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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值