- 博客(15)
- 问答 (1)
- 收藏
- 关注
原创 rk平台sensor驱动开发结束篇
因为我是考虑在基础框架上改动,工作队列采样到内存,再用高精度上报到接口,前几篇文章也写过这个解决方法,但是其中加锁的情况下,后续测试低概率会出现硬锁,因为工作队列和高精度拥有一个锁的情况下,如果工作队列一直不执行就会出现高精度只能被卡在加spin锁的位置导致死锁,这个位置是不能加普通spin_lock的,但是加spin_irqsave之类的会有比较大的消耗,再考虑驱动属于单生产者和单消费者,就改成fifo来存取数据,去掉锁的机制。1.sensor过来的是相同的数据,1.abs类型的会过滤跟上次相同的值。
2024-08-29 14:36:54 374
原创 linux复习2-smbus
PEC是一种错误检测码,如果使用PEC,那么在p信号之前,数据发送放要发送一个字节的PEC码(它是CRC-8码),以smbus send byte为例,下图中一个未使用PEC,另外一个使用PEC。2,smbus为系统和电源管理都提供了一条控制总线,使用smbus的系统,设备之间发送和接受消息都是通过smbus,而不是单独的控制线,这样可以节省设备的管教数。1,最初实现场景是智能电池,充电电池,其他微控制器的通信链路而定义的,后又使用到各种设备,包括电源,系统传感器,eeprom通讯设备等等。
2024-11-05 10:37:19 720
原创 linux之i2c协议复习
3,响应信号(ack):接收器在接受8位数据后,第九个时钟周期,会拉低sda,当第九个时钟检测到sda为0,则认为是收到了ack信号。主机从机都能控制,主机控制时都是正常连接通信时,但是当从机没有空闲,需要处理芯片内部的事情时,会把芯片clk给拉低,让主机稍等一下。2.然后发送一个设备地址加方向(一般是8位的数据,7位位芯片从机号,最后一位是方向位,0表示写,1表示读)2.然后发送一个设备地址加方向(一般是8位的数据,7位位芯片从机号,最后一位是方向位,0表示写,1表示读)i2c传输数据的模式:读,写。
2024-10-28 14:13:06 272
原创 根据adc芯片判断硬件版本
/Vref:1.8v,ADC:12位--(2^12-1)注:每个芯片区间版本都不同,一般分level。根据电压值来打印出对应版本。
2024-09-12 11:18:20 360
原创 rk3588中input框架中的上报过滤规则
(文章中过滤跟这个函数无关)is_event_supported:这个就是个位图的比较位,只要使用的合适,就不会有问题,如果真被这个过滤就是使用的input的类型跟位图位不对应,这就是使用错误了。在上述函数中,实际起过滤作用的是input_get_disposition,在处理时会对一组数据中部分数据做一定的删减,减少上报的量,其中类型包括:abs,rel,msc,key等等。abs在上传数据时会发现当前值(x,y,z)上传时,如果x或者y有某个跟上次相同,会主动丢弃当前的这个相同值,上传其他值。
2024-08-30 13:55:58 193
原创 驱动开发:sensor3
以及假如在采集到相同数据对数据进行更改,避开hal层的丢帧处理。此文补充一下上两篇sensor相关文章的一个点。后续提交时我把先进先出的队列改成标志位判断上报。
2024-07-23 11:28:01 183
原创 驱动开发:先进先出队列
好像就这些,还有很多宏我也没怎么记,希望看完这三篇文章的能解决你们的问题。kfifo_in_spinlocked 带锁的输入到缓冲区。一般这种数据结构的大家一般都学习或练习了解过,就只讲一下用法就行。kfifo_is_full 空间是否已满。kfifo_len 计算其中占参数。kfifo_out 输出到指定位置。kfifo_reset 清空缓冲区。可以参照上面那篇文章的参照做理解。
2024-07-19 14:42:56 239
原创 驱动开发:高精度定时器的使用
CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED这个可以搜索一下,作用是绝对定时,还有其他的宏定义我没咋去了解。回调函数作用是通过每隔一段时间(由start部分去设置)就会过来走一遍计算时间是否满足条件然后进行对应的操作。提示:在开始和停止都需要做判断,不然还没开始做停止或者还没停止又开始都会挂掉。// 是否使用的标志位。input_timer_accel://定时器声明。
2024-07-19 14:29:29 307
原创 rk3588驱动开发 seneor注意点2,解决上传时间戳问题
原因:我搜索解决方法的时候看到一个驱动上报数据是用高精度定时器自己控制,又考虑到原sensor的框架,再加一个先进先出的缓冲区给原框架上报的位置缓存数据,那上报的时间就可以自己控制,不需要在根据工作队列的时间来上传,感觉可行。原因:原来是一个芯片,用杂项设备注册,框架中是一个工作队列去给3个sensor(陀螺仪,加速器,温度)驱动做数据上报,开始想的就是可能是3个同时做上报会有影响,)中提到问题工作队列计时不准的问题,跟供应商要驱动也只有仿造传统rk平台的驱动,这个问题还是存在,那只能自己想办法。
2024-07-19 13:50:41 340
原创 驱动开发:工作队列的使用
是启用该工作队列的作用,此处作用是属于循环调用的作用,但是第一次还没有调用,所以不会走到该函数,需要在想要启动工作的队列的位置再次使用。有加载就要有停止,我是在start_stream中调用开启工作队列,stop_stream中停止工作队列。网上有很多类似的帖子,我只是发一份给自己做一个记录。在初始化该摄像头时调用啦该函数,我是写个函数做热拔插检测的。// 取消挂起的工作项。
2024-07-03 09:58:30 223
原创 rk3588驱动开发:休眠唤醒学习与分析1(个人理解)
1. 初始化与注册:在您的设备驱动程序中,通过将.pm = &max96722_pm_ops设置到设备的驱动结构中,您实际上是告诉内核该设备支持运行时电源管理,并指定了用于挂起(max96722_runtime_suspend)和恢复(max96722_runtime_resume)的函数。在设备驱动程序中,如果设备需要在无中断环境中进行特定的挂起操作,就需要实现这样一个my_device_suspend_noirq函数,并将其指针赋给struct dev_pm_ops的.suspend_noirq成员。
2024-06-28 17:43:59 1063
原创 RK系列3588驱动开发:sensor注意点
如果有做过这个的人就可能有疑问,那上传的值是不是就是上次上传的值,导致hal报错呢,这个我再补充一下机制,hal层是100ms采样,然而sensor的采样是可以设定的,驱动中设定的是5ms的采样,删除retry机制也不会影响到寄存器中已经更新的数据,这个部分就解决啦一部分时间戳的问题,因为是一个6轴加速器,加有温度传感器,实际是有3个驱动,另两个驱动大同小异,只是init部分是通过accle部分就已经初始化好,后面的就没有再次做初始化,然后就是读取的寄存器部分和注册的名称有一定的差异,还是比较简单的。
2024-06-17 13:33:29 1469
原创 (1)window端vscode使用cmake编译,多文件编译(2)使用途中cmake ..报错
cmake .. 无法指定编译环境生成Makefile
2022-08-13 12:27:17 1567 1
原创 【无标题】
项目场景:提示:这里简述项目相关背景:python3中 import torchvision无法载入vision显示如下(jetson nano)import torchvisionTraceback (most recent call last):File “”, line 1, in File “/home/test-car/.local/lib/python3.6/site-packages/torchvision-0.10.0-py3.6-linux-aarch64.egg/torchv
2022-04-09 12:22:35 1825 1
空空如也
make dtbs编译设备树出现错误
2022-05-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人