IIC驱动
IIC驱动框架Linux内核将 I2C 驱动分为两部分:①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。②、 I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。
IIC驱动也是借用platform思想,将设备和总线进行分离,但是IIC有自己的总线,所以就不用使用虚拟总线。
I2C 总线驱动重点是 I2C 适配器(也就是 SOC 的 I2C 接口控制器)驱动,这里要用到两个重要的数据结构: i2c_adapter 和 i2c_algorithm, Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter, i2c_adapter 结构体定义在 include/linux/i2c.h 文件中。
1234567891011121314151617181920212223498 struct i2c_adapter {499 struct module *owner;500 unsigned int class; /* classes to al ...
RTC驱动
Linux 内核中 RTC 驱动调用流程
Linux 内核将 RTC 设备抽象为 rtc_device 结构体,因此 RTC 设备驱动就是申请并初始化rtc_device,最后将 rtc_device 注册到 Linux 内核里面,这样 Linux 内核就有一个 RTC 设备了 。
当 rtc_class_ops 准备好以后需要将其注册到 Linux 内核中,这里我们可以使用rtc_device_register函数完成注册工作。此函数会申请一个rtc_device并且初始化这个rtc_device,最后向调用者返回这个 rtc_device,此函数原型如下:
1234567struct rtc_device *rtc_device_register(const char *name, //设备名字 struct device *dev, //设备 const struct rtc_class_ops *ops,//RTC 底层驱 ...
lcd驱动
Framebuffer在 Linux 中应用程序最终也是通过操作 RGB LCD 的显存来实现在 LCD 上显示字符、图片等信息。 因为虚拟内存的存在,驱动程序设置的显存和应用程序访问的显存要是同一片物理内存。
Framebuffer 诞生了, Framebuffer 翻译过来就是帧缓冲,简称 fb 。fb 是一种机制,将系统中所有跟显示有关的硬件以及软件集合起来,虚拟出一个 fb 设备。帧缓冲是linux系统中的一种显示驱动接口,它将显示设备(比如LCD)进行抽象、屏蔽了不同显示设备硬件的实现,对应用层抽象为一块显示内存(显存),它允许上层应用程序直接对显示缓冲区进行读写操作,而用户不关心物理显存的位置等具体细节,这些都由Framebuffer设备驱动来完成。
显示设备被称为 FrameBuffer 设备(帧缓冲设备),所以 LCD 显示屏自然而言就是 FrameBuffer 设备。 FrameBuffer 设备对应的设备文件为/dev/fbX(X 为数字, 0、 1、 2、 3 等) , Linux下可支持多个 FrameBuffer 设备,最多可达 32 个, ...
input驱动
Input子系统input 就是输入的意思,因此 input 子系统就是管理输入的子系统,和 pinctrl、 gpio 子系统一样,都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等等这些都属于输入设备,为此 input 子系统分为 input 驱动层、 input 核心层、 input 事件处理层,最终给用户空间提供可访问的设备节点。
驱动部分包含三个部分:驱动层,核心层,事件层驱动层:输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。核心层:承上启下,为驱动层提供输入设备注册和操作接口。通知事件层对输入事件进行处理。事件层:主要和用户空间进行交互。
注册input_dev在使用 input 子系统的时候我们只需要注册一个 input 设备即可, input_dev 结构体表示 input设备
1234567891011121314151617181920121 struct input_dev {122 const char *name;123 const char *phys;124 const char *uni ...
MISC设备驱动
MISC驱动所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。 MISC 设备会自动创建 cdev,不需要像手动创建,因此采用 MISC 设备驱动可以简化字符设备驱动的编写。 需要向 Linux 注册一个 miscdevice 设备
1234567891011struct miscdevice { int minor; /* 子设备号 */ const char *name; /* 设备名字 */ const struct file_operations *fops; /* 设备操作集 */ struct list_head list; struct device *parent; struct device *this_device; const struct attribute_group **groups; const char *nodename; umode_t mode;};
Linux 系统已经预定义了一些 MISC 设备的子设备号,这些预定义的子设备号定义在include/linux/miscdev ...
设备树下的platform设备驱动
设备树下的platform驱动在使用设备树的时候,设备的描述被放到了设备树中,因此 platform_device 就不需要我们去编写了,我们只需要实现 platform_driver 即可 。
1.创建设备树中设备节点platform 总线需要通过设备节点的 compatible 属性值来匹配驱动! 以led设备为例子:
123456789gpioled{ #address-cells = <1>; #size-cells = <1>; compatible = "atkalpha-gpioled";//匹配的属性 pinctrl-names = "default"; pinctrl-0 = <&pinctrl_led>; led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>; status = "okay";};
2.编写platform驱动时候要注意兼容属性在使用设备树的时 ...
platform设备驱动
驱动框架传统驱动框架假如现在有三个平台 A、 B 和 C,这三个平台(这里的平台说的是 SOC)上都有 MPU6050 这个 I2C接口的六轴传感器
每种平台下都有一个主机驱动和设备驱动,主机驱动肯定是必须要的,毕竟不同的平台其 I2C 控制器不同。但是右侧的设备驱动就没必要每个平台都写一个,因为不管对于那个 SOC 来说, MPU6050 都是一样,通过 I2C 接口读写数据就行了,只需要一个 MPU6050 的驱动程序即可。
分离后的驱动框架
相当于将设备信息从设备驱动中剥离开来,驱动使用标准方法去获取到设备信息(比如从设备树中获取到设备信息),然后根据获取到的设备信息来初始化设备。 这样就相当于驱动只负责驱动,设备只负责设备,想办法将两者进行匹配即可。这个就是 Linux 中的总线(bus)、驱动(driver)和设备(device)模型,也就是常说的驱动分离。
platformplatform总线paltform是一种虚拟的总线,用于管理外设资源内存资源中断资源。在硬件上有USB-BUS总线,PCI-BUS总线,这是在物理设备上实际存在的总线。USB-BUS管理USB ...
经典滤波算法
1.限幅滤波法(程序判断滤波法)方法:确定两次采样允许的最大偏差值,如果本次值与上次值之差<=A,则本次有效,反之>A,则本次值无效,放弃本次值,上次代替本次值。
优点:克服偶然误差造成的干扰
缺点:无法抑制周期性干扰,平滑度差
核心内容:
12345678910#define A 10char value;char filter(){ char new_value; new_value = get_ad(); if ( ( new_value - value > A ) || ( value - new_value > A ) return value; else return new_value;}
eg:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include "stdio.h"#define A 4float data_number[] = { ...
C知识点
一. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)12#define a_year (365*24*60*60)UL//UL无符号整形
二. 写一个”标准”宏MIN ,这个宏输入两个参数并返回较小的一个1#define MIN( a, b) ((a<=b)?(a):(b))
三. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?123456while(1){}for(;;){}loop:...goto loop;
四. 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)
d)一个有10个整型数的数组( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to inte ...
研电赛
题目:超声接近感知系统(1)赛题主要考察接近感知系统的实现,可使用指示灯的亮灭来表征接近态和远离态
(2)以超声波技术为基础实现接近感知。可辅助使用加速度、陀螺仪或等其他传感器,来提高准确率(如提取接听电话动作中的距离、姿态、运动轨迹…等信息的变化)。
设计stm32pcb
设计姿态传感器pcb由磁力计IST8310和陀螺仪BMI088组成。
由于先设计的硬件,并没确定使用的IO口,所以分为了两个板子,为了符合题目要求,pcb上打上通孔,便于使用螺丝连接。
使用MCU是stm32f407VGT6的型号,在使用usart进行串口通信的时候发现会出现,乱码的问题,最后发现问题的原因出在了,晶振的频率源头上,
#define HSE_VALUE 25000000 把25改为8.
使用两个超声波模块,使用spi和iic通信来读取姿态传感器的数据。
关于SPI的通信使用为了节省CPU的占有率,使用了串口DMA的通信方式,DMA传输将数据从一个地址空间复制到另一个地址空间, 提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
关于这种pcb的贴片焊接,是建议用开一个钢网,之后刷锡膏,放 ...

