mirror of
https://github.com/Fishwaldo/bl_mcu_sdk.git
synced 2025-07-23 05:08:45 +00:00
[docs] update docs
This commit is contained in:
parent
8d46c47542
commit
0d9f65c145
165 changed files with 4363 additions and 1814 deletions
|
@ -12,8 +12,8 @@ BLE
|
|||
- 支持配对包括蓝牙4.2中的安全连接特性
|
||||
- 支持永久存储蓝牙特定的设置和数据
|
||||
+ 蓝牙mesh特性
|
||||
- 支持Relay, Friend Node, Low-Power Node (LPN) and GATT Proxy角色
|
||||
- 支持两种Provisioning bearers(PB-ADV & PB-GATT)
|
||||
- TODO
|
||||
|
||||
- BLE协议栈的架构:
|
||||
.. figure:: img/image1.png
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ ADC 设备
|
|||
简介
|
||||
------------------------
|
||||
ADC (Analog-to-digital Converter) 是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备,他可以将外围电路传感器产生的模拟信号转化为机器可识别的数字信号。
|
||||
博流系列MCU中的ADC设备具有以下特性
|
||||
博流系列 MCU 中的 ADC 设备具有以下特性
|
||||
|
||||
- 可以选择 12/14/16 bits 转换结果输出
|
||||
- ADC最大工作时钟为 2MHZ
|
||||
|
@ -32,14 +32,14 @@ ADC 设备结构体定义
|
|||
adc_pga_gain_t gain;
|
||||
} adc_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- clk_div ADC 模块时钟内部分频
|
||||
- vref 参考电压选择 2.0/3.2V 可选
|
||||
- continuous_conv_mode 是否选择为连续模式,若为连续模式,则一次 adc_start 操作, ADC 连续工作,直到 adc_stop 。否则,每 adc_start 一次,adc 仅转换一次结果。
|
||||
- differential_mode 选择是否为差分模式,若为差分模式,则可以测量负电压。
|
||||
- data_width 测量宽度选择,ADC 实际精度为12 bits ,但是通过 OSR 多次取平均可以达到 14bits / 16bits 的精度,注意,当选择更高的数据宽度后,频率会因为取平均而下降。详情可参考枚举信息。
|
||||
- fifo_threshold 此参数影响 DMA 搬运阈值以及 ADC FIFO 中断阈值
|
||||
- gain ADC 对输入信号的增益选择
|
||||
- **parent** 继承父类属性
|
||||
- **clk_div** ADC 模块时钟内部分频
|
||||
- **vref** 参考电压选择 2.0/3.2V 可选
|
||||
- **continuous_conv_mode** 是否选择为连续模式,若为连续模式,则一次 adc_start 操作, ADC 连续工作,直到 adc_stop 。否则,每 adc_start 一次,adc 仅转换一次结果。
|
||||
- **differential_mode** 选择是否为差分模式,若为差分模式,则可以测量负电压。
|
||||
- **data_width** 测量宽度选择,ADC 实际精度为12 bits ,但是通过 OSR 多次取平均可以达到 14bits / 16bits 的精度,注意,当选择更高的数据宽度后,频率会因为取平均而下降。详情可参考枚举信息。
|
||||
- **fifo_threshold** 此参数影响 DMA 搬运阈值以及 ADC FIFO 中断阈值
|
||||
- **gain** ADC 对输入信号的增益选择
|
||||
- 其他待补充
|
||||
|
||||
ADC 设备参数配置表
|
||||
|
@ -76,8 +76,8 @@ ADC 设备参数配置表
|
|||
|
||||
ADC 设备接口
|
||||
------------------------
|
||||
ADC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
||||
|
||||
ADC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
||||
|
||||
**adc_register**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -86,16 +86,16 @@ ADC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
.. code-block:: C
|
||||
|
||||
int adc_register(enum ADC_index_type index, const char *name);
|
||||
int adc_register(enum adc_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- flag 默认可读可写属性
|
||||
- **index** 要注册的设备索引
|
||||
- **flag** 默认可读可写属性
|
||||
|
||||
``index`` 用来选择 ADC 设备配置,一个 index 对应一个 ADC 设备配置,比如 ``ADC0_INDEX`` 对应 ``ADC0_CONFIG`` 配置,``index`` 有如下可选类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
enum ADC_index_type
|
||||
enum adc_index_type
|
||||
{
|
||||
#ifdef BSP_USING_ADC0
|
||||
ADC0_INDEX,
|
||||
|
@ -106,17 +106,17 @@ ADC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于 ADC 设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``adc_open``。
|
||||
``device_open`` 用于打开一个 ADC 设备,实际调用 ``adc_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
``oflag`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -130,30 +130,30 @@ ADC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``adc_close``。
|
||||
``device_close`` 用于关闭一个 ADC 设备,实际调用 ``adc_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备句柄
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对 ADC 设备进行控制和参数的修改。实际调用 ``adc_control``。
|
||||
``device_control`` 用于对 ADC 设备的进行控制和参数的修改,实际调用 ``adc_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 不同的控制命令返回的意义不同。
|
||||
- **dev** 设备句柄
|
||||
- **cmd** 设备控制命令
|
||||
- **args** 控制参数
|
||||
- **return** 不同的控制命令返回的意义不同。
|
||||
|
||||
串口设备除了标准的控制命令,还具有自己特殊的控制命令。
|
||||
ADC 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -167,33 +167,46 @@ ADC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
``args`` 根据不同的 ``cmd`` 传入不同,具体如下:
|
||||
|
||||
.. list-table:: table1
|
||||
:widths: 15 10 30
|
||||
:header-rows: 1
|
||||
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| cmd | args | description |
|
||||
+================================+====================+==================================+
|
||||
| DEVICE_CTRL_SET_INT | ADC_it_type | 开启 ADC 设备中断 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_CLR_INT | ADC_it_type | 关闭 ADC 设备中断 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_CONFIG | ADC_param_cfg_t* | 修改 ADC 配置 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_ADC_CHANNEL_CONFIG | adc_channel_cfg_t* | 配置 ADC 通道信息 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_ATTACH_RX_DMA | struct device* | 链接接收 DMA 设备 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_ADC_CHANNEL_START | struct device* | 开始/继续 ADC 转换 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_ADC_CHANNEL_STOP | NULL | 停止 ADC 转换 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_ADC_VBAT_ON | NULL | 打开内部 VDD 测量电路 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_ADC_VBAT_OFF | NULL | 关闭内部 VDD 测量电路 |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_ADC_TSEN_ON | NULL | 打开内部温度测量电路(需硬件支持) |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
| DEVICE_CTRL_ADC_TSEN_OFF | uint32_t* | 关闭内部温度测量电路(需硬件支持) |
|
||||
+--------------------------------+--------------------+----------------------------------+
|
||||
|
||||
* - cmd
|
||||
- args
|
||||
- description
|
||||
* - DEVICE_CTRL_SET_INT
|
||||
- adc_it_type
|
||||
- 开启 ADC 设备中断
|
||||
* - DEVICE_CTRL_CLR_INT
|
||||
- adc_it_type
|
||||
- 关闭 ADC 设备中断
|
||||
* - DEVICE_CTRL_CONFIG
|
||||
- ADC_param_cfg_t
|
||||
- 修改 ADC 配置
|
||||
* - DEVICE_CTRL_ADC_CHANNEL_CONFIG
|
||||
- adc_channel_cfg_t
|
||||
- 修改 ADC 通道配置
|
||||
* - DEVICE_CTRL_ATTACH_RX_DMA
|
||||
- struct device*
|
||||
- 链接接收 DMA 设备
|
||||
* - DEVICE_CTRL_ADC_CHANNEL_START
|
||||
- NULL
|
||||
- 开始/继续 ADC 转换
|
||||
* - DEVICE_CTRL_ADC_CHANNEL_STOP
|
||||
- NULL
|
||||
- 停止 ADC 转换
|
||||
* - DEVICE_CTRL_ADC_VBAT_ON
|
||||
- NULL
|
||||
- 打开内部 VDD 测量电路
|
||||
* - DEVICE_CTRL_ADC_VBAT_OFF
|
||||
- NULL
|
||||
- 关闭内部 VDD 测量电路
|
||||
* - DEVICE_CTRL_ADC_TSEN_ON
|
||||
- NULL
|
||||
- 打开内部温度测量电路(需硬件支持)
|
||||
* - DEVICE_CTRL_ADC_TSEN_OFF
|
||||
- NULL
|
||||
- 关闭内部温度测量电路(需硬件支持)
|
||||
|
||||
**device_read**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
@ -204,11 +217,11 @@ ADC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
int device_read(struct device *dev, uint32_t pos, void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要读入的 buffer 缓冲区
|
||||
- size 要读入的长度
|
||||
- return 错误码,0 表示读入成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要读入的 buffer 缓冲区
|
||||
- **size** 要读入的长度
|
||||
- **return** 错误码,0 表示读入成功,其他表示错误
|
||||
|
||||
**device_set_callback**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -219,15 +232,15 @@ ADC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
int device_set_callback(struct device *dev, void (*callback)(struct device *dev, void *args, uint32_t size, uint32_t event));
|
||||
|
||||
- dev 设备句柄
|
||||
- callback 要注册的中断回调函数
|
||||
- **dev** 设备句柄
|
||||
- **callback** 要注册的中断回调函数
|
||||
|
||||
- dev 设备句柄
|
||||
- args 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- size 传输长度
|
||||
- event 中断事件类型
|
||||
- **dev** 设备句柄
|
||||
- **args** 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- **size** 传输长度
|
||||
- **event** 中断事件类型
|
||||
|
||||
串口设备 ``event`` 类型如下
|
||||
``event`` 类型如下
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
uint32_t system_clock_get(enum system_clock_type type);
|
||||
|
||||
- type 获取的系统时钟频率类型
|
||||
- **type** 获取的系统时钟频率类型
|
||||
|
||||
``type`` 提供以下几种类型
|
||||
|
||||
|
@ -45,7 +45,7 @@
|
|||
|
||||
uint32_t peripheral_clock_get(enum peripheral_clock_type type);
|
||||
|
||||
- type 获取的外设时钟频率类型
|
||||
- **type** 获取的外设时钟频率类型
|
||||
|
||||
``type`` 提供以下几种类型
|
||||
|
||||
|
|
|
@ -32,18 +32,18 @@ DMA 设备结构体定义
|
|||
dma_lli_ctrl_t *lli_cfg;
|
||||
} dma_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- id DMA id号,默认0,当前只有一个DMA
|
||||
- ch 通道号
|
||||
- direction 传输方向
|
||||
- transfer_mode 传输模式
|
||||
- src_req 源请求
|
||||
- dst_req 目标请求
|
||||
- src_burst_size 源突发字节数
|
||||
- dst_burst_size 目标突发字节数
|
||||
- src_width 源传输位宽
|
||||
- dst_width 目标传输位宽
|
||||
- lli_cfg 用来存储dma通道的一些信息,用户不用管
|
||||
- **parent** 继承父类属性
|
||||
- **id** DMA id号,默认0,当前只有一个DMA
|
||||
- **ch** 通道号
|
||||
- **direction** 传输方向
|
||||
- **transfer_mode** 传输模式
|
||||
- **src_req** 源请求
|
||||
- **dst_req** 目标请求
|
||||
- **src_burst_size** 源突发字节数
|
||||
- **dst_burst_size** 目标突发字节数
|
||||
- **src_width** 源传输位宽
|
||||
- **dst_width** 目标传输位宽
|
||||
- **lli_cfg** 用来存储dma通道的一些信息,用户不用管
|
||||
|
||||
``direction`` 提供以下类型
|
||||
|
||||
|
@ -213,14 +213,14 @@ DMA 设备接口全部遵循标准设备驱动管理层提供的接口。并且
|
|||
**dma_register**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``dma_register`` 用来注册 DMA 设备标准驱动接口,在注册之前需要打开对应 DMA 设备的通道宏定义。例如定义宏 ``BSP_USING_DMA_CH0`` 方可使用 ``DMA`` 设备的 0 通道,注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 ``DMA`` 设备的 0 通道。
|
||||
``dma_register`` 用来注册一个 DMA 设备标准驱动接口,在注册之前需要打开对应 DMA 设备的通道宏定义。例如定义宏 ``BSP_USING_DMA_CH0`` 方可使用 ``DMA`` 设备的 0 通道,注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 ``DMA`` 设备的 0 通道。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int dma_register(enum dma_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- name 为注册的设备命名
|
||||
- **index** 要注册的设备索引
|
||||
- **name** 为注册的设备命名
|
||||
|
||||
``index`` 用来选择 DMA 设备某个通道的配置,一个 index 对应一个 DMA 设备的一个通道配置,比如 ``DMA_CH0_INDEX`` 对应 DMA 通道0 配置,``index`` 有如下可选类型
|
||||
|
||||
|
@ -258,17 +258,17 @@ DMA 设备接口全部遵循标准设备驱动管理层提供的接口。并且
|
|||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``dma_open``。
|
||||
``device_open`` 用于打开一个 DMA 设备的一个通道,实际调用 ``dma_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
``oflag`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -282,28 +282,28 @@ DMA 设备接口全部遵循标准设备驱动管理层提供的接口。并且
|
|||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``dma_close``。
|
||||
``device_close`` 用于关闭 DMA 设备的一个通道,实际调用 ``dma_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0 表示关闭成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **return** 错误码,0 表示关闭成功,其他表示错误
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对设备进行控制和参数的修改。实际调用 ``dma_control``。
|
||||
``device_control`` 用于对 DMA 设备的一个通道进行控制和参数的修改,实际调用 ``dma_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 不同的控制命令返回的意义不同。
|
||||
- **dev** 设备句柄
|
||||
- **cmd** 设备控制命令
|
||||
- **args** 控制参数
|
||||
- **return** 不同的控制命令返回的意义不同。
|
||||
|
||||
DMA 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
||||
|
||||
|
@ -345,21 +345,21 @@ DMA 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
|||
**device_set_callback**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_set_callback`` 用于注册一个DMA通道中断回调函数。
|
||||
``device_set_callback`` 用于注册一个 DMA 设备的一个通道中断回调函数。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_set_callback(struct device *dev, void (*callback)(struct device *dev, void *args, uint32_t size, uint32_t event));
|
||||
|
||||
- dev 设备句柄
|
||||
- callback 要注册的中断回调函数
|
||||
- **dev** 设备句柄
|
||||
- **callback** 要注册的中断回调函数
|
||||
|
||||
- dev 设备句柄
|
||||
- args 无用
|
||||
- size 无用
|
||||
- event 中断事件类型
|
||||
- **dev** 设备句柄
|
||||
- **args** 无用
|
||||
- **size** 无用
|
||||
- **event** 中断事件类型
|
||||
|
||||
DMA 设备 ``event`` 类型如下
|
||||
``event`` 类型如下
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -372,62 +372,95 @@ DMA 设备 ``event`` 类型如下
|
|||
**dma_channel_start**
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``dma_channel_start`` 用于开启DMA通道。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DMA_CHANNEL_START``。
|
||||
``dma_channel_start`` 用于开启 DMA 通道。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DMA_CHANNEL_START``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
dma_channel_start(dev)
|
||||
|
||||
- dev 需要开启的pwm通道句柄
|
||||
- **dev** 需要开启的 dma 通道句柄
|
||||
|
||||
|
||||
**dma_channel_stop**
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``dma_channel_stop`` 用于关闭DMA通道。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DMA_CHANNEL_STOP``。
|
||||
``dma_channel_stop`` 用于关闭一个 DMA 通道。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DMA_CHANNEL_STOP``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
dma_channel_stop(dev)
|
||||
|
||||
- dev 需要关闭的pwm通道句柄
|
||||
- **dev** 需要关闭的 dma 通道句柄
|
||||
|
||||
|
||||
**dma_channel_update**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``dma_channel_update`` 用于更新DMA配置。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DMA_CHANNEL_UPDATE``。
|
||||
``dma_channel_update`` 用于更新 DMA 的一个通道配置。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DMA_CHANNEL_UPDATE``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
dma_channel_update(dev,list)
|
||||
|
||||
- dev 需要更新的pwm通道句柄
|
||||
- list dma_lli_ctrl_t句柄
|
||||
- **dev** 需要更新的 dma 通道句柄
|
||||
- **list** dma_lli_ctrl_t句柄
|
||||
|
||||
|
||||
**dma_channel_check_busy**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``dma_channel_check_busy`` 用于查询当前使用的DMA通道是否传输完成。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DMA_CHANNEL_GET_STATUS``。
|
||||
``dma_channel_check_busy`` 用于查询当前使用的 DMA 通道是否传输完成。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DMA_CHANNEL_GET_STATUS``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
dma_channel_check_busy(dev)
|
||||
|
||||
- dev 需要查询的DMA通道句柄
|
||||
- 返回当前DMA状态,0为传输完成,1为未传输完成
|
||||
- **dev** 需要查询的 dma 通道句柄
|
||||
- **return** 当前 dma 状态,0为传输完成,1为未传输完成
|
||||
|
||||
**dma_reload**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``dma_reload`` 用于更新DMA某个通道的配置,相比于 ``dma_channel_update`` ,该函数无需用户传递很多参数,只需要填入源地址和目标地址,以及长度,内部会自己计算后再进行配置。此函数调用后,DMA通道是没有开启的,需要手动调用 ``dma_channel_start`` 函数。
|
||||
``dma_reload`` 用于更新 DMA 一个通道的配置,相比于 ``dma_channel_update`` ,该函数无需用户传递很多参数,只需要填入源地址和目标地址,以及长度,内部会自己计算后再进行配置。此函数调用后,DMA通道是没有开启的,需要手动调用 ``dma_channel_start`` 函数。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int dma_reload(struct device *dev, uint32_t src_addr, uint32_t dst_addr, uint32_t transfer_size);
|
||||
|
||||
- dev 需要查询的DMA通道句柄
|
||||
- src_addr 传输源地址
|
||||
- dst_addr 传输目标地址
|
||||
- transfer_size 传输字节总长度,如果传输的位数是16位、32位,这里需要进行转换成字节长度。
|
||||
- **dev** 需要查询的DMA通道句柄
|
||||
- **src_addr** 传输源地址
|
||||
- **dst_addr** 传输目标地址
|
||||
- **transfer_size** 传输字节总长度,如果传输的位数是16位、32位,这里需要进行转换成字节长度。
|
||||
|
||||
|
||||
|
||||
DMA 的效率与FIFO
|
||||
------------------------
|
||||
|
||||
内存到内存
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
- DMA在搬运数据时,会以设定的位宽 ``xxx_width`` 与 设定的突发量 ``xxx_burst_size`` 去访问总线进行数据读写,在内存到内存的搬运时,一般 source 端与 destination 端的配置相同。
|
||||
|
||||
- 在总的数据量(data size)不变的情况下,位宽 ``xxx_width`` 越大传输速度越快,效率越高,但传输的数据总量(data size)必须是位宽 ``xxx_width`` 的整倍数,数据的地址也必须是 ``xxx_width`` 的整倍数(地址对齐),否则会出错。
|
||||
|
||||
- 在连续读写时,burst 突发模式的总线利用效率比 single 单次模式高得多,因此可以尽量提高 ``xxx_burst_size``,但注意,DMA0 的每个通道只有 16Byte 的 FIFO,因此 width 乘 burst_size 的积必须小于等于 16Byte。
|
||||
|
||||
因此在内存到内存搬运数据时,最高效的是 ``xxx_width`` 值为 ``DMA_TRANSFER_WIDTH_32BIT``, ``xxx_burst_size`` 值为 ``DMA_BURST_4BYTE``,此时完全利用了 DMA 的FIFO,读写最快,总线占用最少,但要求数据量与地址满足对齐要求。
|
||||
|
||||
|
||||
外设到内存 与 内存到外设
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
很多传输接口外设是存在 tx-FIFO 与 rx-FIFO 的,这些 FIFO 可以让外设的使用更加灵活方便,在与 DMA 配合使用时也可以增加效率。
|
||||
|
||||
- 在使用 DMA-接口外设 发送数据时,注意 DMA 的 ``des_width`` 与外设的 tx-FIFO 有效数据宽度应当一致,如使用 UART 时一般为 DMA_TRANSFER_WIDTH_8BIT。接收数据时 DMA 的 ``src_width`` 与 rx-FIFO 有效数据宽度也要一致。
|
||||
|
||||
- 外设端的 burst_size 对 外设的 FIFO 深度有要求,burst_size 必须小于等于 外设配置的 ``fifo_threshold`` 以保证不会出现写溢出或读溢出。
|
||||
|
||||
- 内存端配置的 burst_size 和 width 与外设端的可以不相等,但 burst_size 与 width 的乘积必须相等,并且小于 16Byte。内存端配置更高的 ``xxx_width`` 可以提高传输速度,减少对总线占用,但注意对数据量(data size)与地址的对齐要求。
|
||||
|
||||
如对于 I2S ,他的 tx 与 rx 的 FIFO 深度都为 8,I2S 最佳的 ``fifo_threshold`` 应为 4,DMA 的 ``xxx_burst_size`` 应该为 ``DMA_BURST_4BYTE``,这样能保证 I2S 的 FIFO 能留有一定余量防止出现 rx-FIFO 溢出与 tx-FIFO 欠载,又减少 DMA 了对总线的占用。
|
||||
|
||||
又如对于 SPI ,他的 tx 与 rx 的 FIFO 深度都为 4,若使用 burst_size 为 4 的方式传输,那么 SPI 的 ``fifo_threshold`` 只能是 4,没有冗余,若此时 CPU 在占用总线导致 DMA 传输不及时,可能会出现SPI传输间歇,在SPI从机模式下还可能出现发送欠载与接收溢出。
|
||||
因此对于 SPI 而言,最佳的 ``fifo_threshold`` 应为 1,DMA 的 ``xxx_burst_size`` 应为 ``DMA_BURST_1BYTE``,此时 DMA 虽然对总线的访问效率一般,但保证了 SPI 的 FIFO 有冗余,不会出现上诉问题。
|
|
@ -13,7 +13,7 @@ GPIO 全称 General Purpose Input Output(通用输入 / 输出),博流系
|
|||
- 硬件消抖
|
||||
- 驱动能力控制
|
||||
|
||||
bl mcu sdk 的引脚配置方式分为两种。
|
||||
**bl mcu sdk** 的引脚配置方式分为两种。
|
||||
|
||||
- GPIO 复用功能通过专门的 **pinmux table** ,用户只需要修改 table 中的相关引脚的功能,程序会自动配置这些引脚。**pinmux table** 位于 ``bsp/board/xxx_board`` 目录下 ``pinmux_config.h`` 文件。
|
||||
- 通过标准的 GPIO 设备接口配置引脚,缺点是只能配置普通的输入输出和中断功能,复用功能建议还是使用 table 进行配置。
|
||||
|
@ -30,8 +30,8 @@ GPIO 设备接口
|
|||
|
||||
void gpio_set_mode(uint32_t pin, uint32_t mode);
|
||||
|
||||
- pin 要配置的引脚
|
||||
- mode 要配置的引脚功能
|
||||
- **pin** 要配置的引脚
|
||||
- **mode** 要配置的引脚功能
|
||||
|
||||
``mode`` 提供以下几种类型
|
||||
|
||||
|
@ -62,8 +62,8 @@ GPIO 设备接口
|
|||
void gpio_write(uint32_t pin, uint32_t value);
|
||||
|
||||
|
||||
- pin 要设置的引脚
|
||||
- value 要设置的电平
|
||||
- **pin** 要设置的引脚
|
||||
- **value** 要设置的电平
|
||||
|
||||
**gpio_toggle**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -74,7 +74,7 @@ GPIO 设备接口
|
|||
|
||||
void gpio_toggle(uint32_t pin);
|
||||
|
||||
- pin 要翻转的引脚
|
||||
- **pin** 要翻转的引脚
|
||||
|
||||
**gpio_read**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -86,8 +86,8 @@ GPIO 设备接口
|
|||
int gpio_read(uint32_t pin);
|
||||
|
||||
|
||||
- pin 要读取电平的引脚
|
||||
- return 0 为低电平,1 为高电平
|
||||
- **pin** 要读取电平的引脚
|
||||
- **return** 0 为低电平,1 为高电平
|
||||
|
||||
**gpio_attach_irq**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -98,8 +98,8 @@ GPIO 设备接口
|
|||
|
||||
void gpio_attach_irq(uint32_t pin, void (*cbfun)(uint32_t pin));
|
||||
|
||||
- pin 要附加中断回调的引脚
|
||||
- cbfun 要注册的中断回调函数
|
||||
- **pin** 要附加中断回调的引脚
|
||||
- **cbfun** 要注册的中断回调函数
|
||||
|
||||
**gpio_irq_enable**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -110,5 +110,5 @@ GPIO 设备接口
|
|||
|
||||
void gpio_irq_enable(uint32_t pin,uint8_t enabled);
|
||||
|
||||
- pin 要开启或者关闭中断的引脚
|
||||
- enabled 0 为关闭中断,1 为打开中断
|
||||
- **pin** 要开启或者关闭中断的引脚
|
||||
- **enabled** 0 为关闭中断,1 为打开中断
|
||||
|
|
|
@ -27,10 +27,10 @@ I2C 设备结构体定义
|
|||
uint32_t phase;
|
||||
} i2c_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- ch i2c id,0 表示 i2c0,1 表示 i2c1
|
||||
- mode i2c 传输模式,0 为使用硬件 i2c,1 为使用软件 i2c,当前软件 i2c 暂时无效
|
||||
- phase 用来计算 i2c 实际时序时钟 ,公式:i2c_clk = i2c_source_clk/(4*(phase+1))
|
||||
- **parent** 继承父类属性
|
||||
- **ch** i2c id,0 表示 i2c0,1 表示 i2c1
|
||||
- **mode** i2c 传输模式,0 为使用硬件 i2c,1 为使用软件 i2c,当前软件 i2c 暂时无效
|
||||
- **phase** 用来计算 i2c 实际时序时钟 ,公式:i2c_clk = i2c_source_clk/(4*(phase+1))
|
||||
- 其他待补充
|
||||
|
||||
I2C 设备参数配置表
|
||||
|
@ -71,14 +71,14 @@ I2C 设备标准接口当前仅使用 ``device_open`` , 并提供标准的数据
|
|||
**i2c_register**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``i2c_register`` 用来注册 I2C 设备标准驱动接口,在注册之前需要打开对应 I2C 设备的宏定义。例如定义宏 ``BSP_USING_I2C0`` 方可使用 ``I2C0`` 设备,注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 ``I2C0`` 设备。
|
||||
``i2c_register`` 用来注册一个 I2C 设备标准驱动接口,在注册之前需要打开对应 I2C 设备的宏定义。例如定义宏 ``BSP_USING_I2C0`` 方可使用 ``I2C0`` 设备,注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 ``I2C0`` 设备。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int i2c_register(enum i2c_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- name 为注册的设备命名
|
||||
- **index** 要注册的设备索引
|
||||
- **name** 为注册的设备命名
|
||||
|
||||
``index`` 用来选择 I2C 设备,一个 index 对应一个 I2C 设备配置,比如 ``I2C0_INDEX`` 对应 ``I2C0_CONFIG`` 配置,``index`` 有如下可选类型
|
||||
|
||||
|
@ -95,17 +95,17 @@ I2C 设备标准接口当前仅使用 ``device_open`` , 并提供标准的数据
|
|||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``i2c_open``。
|
||||
``device_open`` 用于打开一个 I2C 设备,实际调用 ``i2c_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
``oflag`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -125,10 +125,10 @@ I2C 设备标准接口当前仅使用 ``device_open`` , 并提供标准的数据
|
|||
|
||||
int i2c_transfer(struct device *dev, i2c_msg_t msgs[], uint32_t num);
|
||||
|
||||
- dev 设备句柄
|
||||
- msgs 需要传输的消息
|
||||
- num 消息个数
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **msgs** 需要传输的消息
|
||||
- **num** 消息个数
|
||||
- **return** 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``i2c_msg_t`` 结构体定义如下:
|
||||
|
||||
|
@ -143,11 +143,11 @@ I2C 设备标准接口当前仅使用 ``device_open`` , 并提供标准的数据
|
|||
uint8_t *buf;
|
||||
} i2c_msg_t;
|
||||
|
||||
- slaveaddr i2c 从设备7位从机地址
|
||||
- subaddr i2c 从设备寄存器地址
|
||||
- flags 读写模式以及寄存器地址长度
|
||||
- len 传输数据长度
|
||||
- buf 数据缓冲区
|
||||
- **slaveaddr** i2c 从设备7位从机地址
|
||||
- **subaddr** i2c 从设备寄存器地址
|
||||
- **flags** 读写模式以及寄存器地址长度
|
||||
- **len** 传输数据长度
|
||||
- **buf** 数据缓冲区
|
||||
|
||||
其中 ``flags`` 有如下定义:
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ I2S 设备
|
|||
|
||||
简介
|
||||
------------------------
|
||||
|
||||
I2S (Inter—IC Sound) 总线, 又称集成电路内置音频总线,为数字音频设备之间的音频数据传输而制定的一种总线标准,
|
||||
该总线专门用于音频设备之间的数据传输,广泛应用于各种多媒体系统。博流系列 MCU 中 I2S 设备具有以下特性:
|
||||
|
||||
|
@ -33,17 +34,17 @@ I2S 设备结构体定义
|
|||
void *rx_dma;
|
||||
} i2s_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- id 外设 id 号, 0 表示 I2S0
|
||||
- iis_mode 主从模式选择
|
||||
- interface_mode 协议类型
|
||||
- sampl_freq_hz 音频数据采样率
|
||||
- channel_num 音频通道数,非 DSP 模式下最高 2 通道
|
||||
- frame_size 帧格式长度,即每个通道音频的 BCLK 个数
|
||||
- data_size 实际的有效音频数据位宽,不能大于 frame_size
|
||||
- fifo_threshold 收发数据的 fifo 深度阈值
|
||||
- tx_dma 附加的发送 dma 句柄
|
||||
- rx_dma 附加的接收 dma 句柄
|
||||
- **parent** 继承父类属性
|
||||
- **id** 外设 id 号, 0 表示 I2S0
|
||||
- **iis_mode** 主从模式选择
|
||||
- **interface_mode** 协议类型
|
||||
- **sampl_freq_hz** 音频数据采样率
|
||||
- **channel_num** 音频通道数,非 DSP 模式下最高 2 通道
|
||||
- **frame_size** 帧格式长度,即每个通道音频的 BCLK 个数
|
||||
- **data_size** 实际的有效音频数据位宽,不能大于 frame_size
|
||||
- **fifo_threshold** 收发数据的 fifo 深度阈值
|
||||
- **tx_dma** 附加的发送 dma 句柄
|
||||
- **rx_dma** 附加的接收 dma 句柄
|
||||
|
||||
``iis_mode`` 提供以下类型
|
||||
|
||||
|
@ -104,7 +105,7 @@ I2S 设备参数配置表
|
|||
|
||||
每一个 I2S 设备都有一个参数配置宏,宏定义位于 ``bsp/board/xxx`` 目录下 ``peripheral_config.h`` 文件,
|
||||
因此无需用户自己定义变量。当用户打开对应设备的宏,该设备的配置才生效。
|
||||
例如打开宏 ``BSP_USING_I2S0`` ,``I2S0_CONFIG`` 即生效,同时 ``I2S0`` 设备就可以进行注册和使用了。
|
||||
例如打开宏 ``BSP_USING_I2S0`` , ``I2S0_CONFIG`` 即生效,同时 ``I2S0`` 设备就可以进行注册和使用了。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -140,7 +141,7 @@ I2S 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**i2s_register**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``i2s_register`` 用来注册 I2S 标准驱动接口,在注册之前需要打开对应 I2S 设备的宏定义,例如定义宏 ``BSP_USING_I2S0`` 方可使用 I2S0 设备。注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 I2S 设备。
|
||||
``i2s_register`` 用来注册一个 I2S 标准驱动接口,在注册之前需要打开对应 I2S 设备的宏定义,例如定义宏 ``BSP_USING_I2S0`` 方可使用 I2S0 设备。注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 I2S 设备。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -163,18 +164,18 @@ I2S 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``i2s_open``。
|
||||
``device_open`` 用于开启一个 I2S 设备,实际调用 ``i2s_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
``oflag`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -186,28 +187,28 @@ I2S 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``i2s_close``。
|
||||
``device_close`` 用于关闭一个 I2S 设备,实际调用 ``i2s_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0 表示关闭成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **return** 错误码,0 表示关闭成功,其他表示错误
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对设备进行控制和参数的修改。实际调用 ``i2s_control``。
|
||||
``device_control`` 用于对 I2S 设备的进行控制和参数的修改,实际调用 ``i2s_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 不同的控制命令返回的意义不同。
|
||||
- **dev** 设备句柄
|
||||
- **cmd** 设备控制命令
|
||||
- **args** 控制参数
|
||||
- **return** 不同的控制命令返回的意义不同。
|
||||
|
||||
I2S 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
||||
|
||||
|
@ -247,11 +248,11 @@ I2S 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
|||
|
||||
int device_write(struct device *dev, uint32_t pos, const void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要写入的 buffer 缓冲区
|
||||
- size 要写入的长度
|
||||
- return 错误码,0 表示写入成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要写入的 buffer 缓冲区
|
||||
- **size** 要写入的长度
|
||||
- **return** 错误码,0 表示写入成功,其他表示错误
|
||||
|
||||
**device_read**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
@ -262,9 +263,9 @@ I2S 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
|||
|
||||
int device_read(struct device *dev, uint32_t pos, void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要读入的 buffer 缓冲区
|
||||
- size 要读入的长度
|
||||
- return 错误码,0 表示读入成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要读入的 buffer 缓冲区
|
||||
- **size** 要读入的长度
|
||||
- **return** 错误码,0 表示读入成功,其他表示错误
|
||||
|
||||
|
|
|
@ -26,13 +26,13 @@ PWM 设备结构体定义
|
|||
|
||||
} pwm_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- ch 通道号,使能PWM通道0则ch为0,使能PWM通道0则ch为1,以此类推
|
||||
- polarity_invert_mode 极性翻转使能
|
||||
- period PWM 周期值
|
||||
- threshold_low PWM 低门限阈值,不能大于period
|
||||
- threshold_high PWM 高门限阈值,不能大于period
|
||||
- it_pulse_count 触发中断条件的周期计数值
|
||||
- **parent** 继承父类属性
|
||||
- **ch** 通道号,使能PWM通道0则ch为0,使能PWM通道0则ch为1,以此类推
|
||||
- **polarity_invert_mode** 极性翻转使能
|
||||
- **period** PWM 周期值
|
||||
- **threshold_low** PWM 低门限阈值,不能大于period
|
||||
- **threshold_high** PWM 高门限阈值,不能大于period
|
||||
- **it_pulse_count** 触发中断条件的周期计数值
|
||||
|
||||
.. note:: PWM 实际频率 = PWM 时钟源/分频/period ,period 非 PWM 实际周期,
|
||||
|
||||
|
@ -90,14 +90,14 @@ PWM 设备接口全部遵循标准设备驱动管理层提供的接口。并且
|
|||
**pwm_register**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``pwm_register`` 用来注册 PWM 设备的一个通道的标准驱动接口,在注册之前需要打开对应 PWM 设备某个通道的宏定义,例如定义 ``BSP_USING_PWM_CH0`` 方可使用 ``PWM`` 通道0 设备。注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 PWM 设备。
|
||||
``pwm_register`` 用来注册一个 PWM 设备的一个通道的标准驱动接口,在注册之前需要打开对应 PWM 设备某个通道的宏定义,例如定义 ``BSP_USING_PWM_CH0`` 方可使用 ``PWM`` 通道0 设备。注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 PWM 设备。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int pwm_register(enum pwm_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- name 为注册的设备命名
|
||||
- **index** 要注册的设备索引
|
||||
- **name** 为注册的设备命名
|
||||
|
||||
``index`` 用来选择 PWM 设备某个通道的配置,一个 index 对应一个 PWM 设备的一个通道配置,比如 ``PWM_CH0_INDEX`` 对应 PWM 通道0 配置,``index`` 有如下可选类型
|
||||
|
||||
|
@ -126,17 +126,17 @@ PWM 设备接口全部遵循标准设备驱动管理层提供的接口。并且
|
|||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``pwm_open``。
|
||||
``device_open`` 用于打开一个 PWM 设备的一个通道,实际调用 ``pwm_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
``oflag`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -150,28 +150,28 @@ PWM 设备接口全部遵循标准设备驱动管理层提供的接口。并且
|
|||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``pwm_close``。
|
||||
``device_close`` 用于关闭一个 PWM 设备的一个通道,实际调用 ``pwm_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0 表示关闭成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **return** 错误码,0 表示关闭成功,其他表示错误
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对设备进行控制和参数的修改。实际调用 ``pwm_control``。
|
||||
``device_control`` 用于对 PWM 设备的一个通道进行控制和参数的修改,实际调用 ``pwm_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 不同的控制命令返回的意义不同。
|
||||
- **dev** 设备句柄
|
||||
- **cmd** 设备控制命令
|
||||
- **args** 控制参数
|
||||
- **return** 不同的控制命令返回的意义不同。
|
||||
|
||||
PWM 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
||||
|
||||
|
@ -195,33 +195,33 @@ PWM 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
|||
- NULL
|
||||
- 关闭当前 PWM 通道
|
||||
* - DEVICE_CTRL_PWM_FREQUENCE_CONFIG
|
||||
- NULL
|
||||
- uint32_t
|
||||
- 配置当前 PWM 通道周期值
|
||||
* - DEVICE_CTRL_PWM_DUTYCYCLE_CONFIG
|
||||
- NULL
|
||||
- pwm_dutycycle_config_t
|
||||
- 配置当前 PWM 通道占空比
|
||||
* - DEVICE_CTRL_PWM_IT_PULSE_COUNT_CONFIG
|
||||
- NULL
|
||||
- uint32_t
|
||||
- 配置触发 PWM 中断周期值
|
||||
|
||||
**device_set_callback**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_set_callback`` 用于注册一个PWM通道中断回调函数。
|
||||
``device_set_callback`` 用于注册一个 PWM 设备的一个通道中断回调函数。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_set_callback(struct device *dev, void (*callback)(struct device *dev, void *args, uint32_t size, uint32_t event));
|
||||
|
||||
- dev 设备句柄
|
||||
- callback 要注册的中断回调函数
|
||||
- **dev** 设备句柄
|
||||
- **callback** 要注册的中断回调函数
|
||||
|
||||
- dev 设备句柄
|
||||
- args 无用
|
||||
- size 无用
|
||||
- event 中断事件类型
|
||||
- **dev** 设备句柄
|
||||
- **args** 无用
|
||||
- **size** 无用
|
||||
- **event** 中断事件类型
|
||||
|
||||
PWM设备 ``event`` 类型如下
|
||||
``event`` 类型如下
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -233,61 +233,61 @@ PWM设备 ``event`` 类型如下
|
|||
**pwm_channel_start**
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``pwm_channel_start`` 用于开启PWM通道。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEVICE_CTRL_RESUME``。
|
||||
``pwm_channel_start`` 用于开启 PWM 通道。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEVICE_CTRL_RESUME``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
pwm_channel_start(dev)
|
||||
|
||||
- dev 需要开启的pwm通道句柄
|
||||
- **dev** 需要开启的 pwm 通道句柄
|
||||
|
||||
|
||||
**pwm_channel_stop**
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``pwm_channel_stop`` 用于关闭PWM通道。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEVICE_CTRL_SUSPEND``。
|
||||
``pwm_channel_stop`` 用于关闭 PWM 通道。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEVICE_CTRL_SUSPEND``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
pwm_channel_stop(dev)
|
||||
|
||||
- dev 需要关闭的pwm通道句柄
|
||||
- **dev** 需要关闭的 pwm 通道句柄
|
||||
|
||||
|
||||
**pwm_channel_freq_update**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``pwm_channel_freq_update`` 用于更新PWM通道的频率。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEIVCE_CTRL_PWM_FREQUENCE_CONFIG``。
|
||||
``pwm_channel_freq_update`` 用于更新 PWM 通道的频率。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEIVCE_CTRL_PWM_FREQUENCE_CONFIG``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
pwm_channel_freq_update(dev,count)
|
||||
|
||||
- dev 需要更新的pwm通道句柄
|
||||
- count 周期值 ,实际频率=pwm_clk/pwm_div/count
|
||||
- **dev** 需要更新的 pwm 通道句柄
|
||||
- **count** 周期值,实际频率 = pwm_clk/pwm_div/count
|
||||
|
||||
**pwm_channel_dutycycle_update**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``pwm_channel_dutycycle_update`` 用于更新PWM通道的频率。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEIVCE_CTRL_PWM_DUTYCYCLE_CONFIG``。
|
||||
``pwm_channel_dutycycle_update`` 用于更新 PWM 通道的频率。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEIVCE_CTRL_PWM_DUTYCYCLE_CONFIG``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
pwm_channel_dutycycle_update(dev,cfg)
|
||||
|
||||
- dev 需要更新周期计数值的pwm通道句柄
|
||||
- cfg pwm_dutycycle_config_t句柄
|
||||
- **dev** 需要更新周期计数值的 pwm 通道句柄
|
||||
- **cfg** pwm_dutycycle_config_t 句柄
|
||||
|
||||
|
||||
**pwm_it_pulse_count_update**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``pwm_it_pulse_count_update`` 用于更新PWM通道的计数值,需要先使能PWM中断才起作用,当pwm计数达到设置的周期计数值则会产生中断。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEIVCE_CTRL_PWM_IT_PULSE_COUNT_CONFIG``。
|
||||
``pwm_it_pulse_count_update`` 用于更新 PWM 通道的计数值,需要先使能 PWM 中断才起作用,当 pwm 计数达到设置的周期计数值则会产生中断。实际是调用 ``device_control`` ,其中 ``cmd`` 为 ``DEIVCE_CTRL_PWM_IT_PULSE_COUNT_CONFIG``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
pwm_it_pulse_count_update(dev,count)
|
||||
|
||||
- dev 需要更新周期计数值的pwm通道句柄
|
||||
- count 周期计数值
|
||||
- **dev** 需要更新周期计数值的 pwm 通道句柄
|
||||
- **count** 周期计数值
|
||||
|
||||
|
|
|
@ -0,0 +1,317 @@
|
|||
QDEC 设备
|
||||
=========================
|
||||
|
||||
简介
|
||||
------------------------
|
||||
|
||||
QDEC(quadrature decoder)正交解码器,用于将双路旋转编码器产生的两组相位相差 90 度的脉冲解码为对应转速和旋转方向。博流系列 MCU 中 QDEC 设备具有以下特性:
|
||||
|
||||
- 拥有 3 组 QDEC 设备可使用
|
||||
- 多种时钟来源选择,QDEC 的时钟源可以设置为 32KHz 或者 32MHz,当使用 32KHz 的时钟源时,可以从睡眠模式中唤醒
|
||||
- 5-bit 时钟分频器,分频系数为 1-32
|
||||
- 16-bit 脉冲计数器,计数范围 -32768~32767 pulse/sample
|
||||
- 12 种可配置的 sample 周期(32us~131ms per sample at 1MHz)
|
||||
- 16-bit 可设置的 report 周期(0~65535 sample/report)
|
||||
- 内置一个可随采样进行闪烁的 LED 功能(LED on/off 0~511 us/sample)
|
||||
- 支持 4 路可配置中断源(sample 中断、report 中断、error 中断、overflow 中断)
|
||||
- 可配置为 PDS 的唤醒源(clock source 需要配置为 32KHz)
|
||||
|
||||
QDEC 设备结构体定义
|
||||
------------------------
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
typedef struct qdec_device {
|
||||
struct device parent;
|
||||
uint8_t id;
|
||||
uint8_t acc_mode;
|
||||
uint8_t sample_mode;
|
||||
uint8_t sample_period;
|
||||
uint8_t report_mode;
|
||||
uint32_t report_period;
|
||||
uint8_t led_en;
|
||||
uint8_t led_swap;
|
||||
uint16_t led_period;
|
||||
uint8_t deglitch_en;
|
||||
uint8_t deglitch_strength;
|
||||
} qdec_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- id 正交解码器 id ,使用正交解码器 0 则 id 为 0 ,使用正交解码器 1 则 id 为 1 ,以此类推
|
||||
- acc_mode QDEC 计数模式:连续计数和溢出即停止 两种模式
|
||||
- sample_mode QDEC 采样模式:连续采样和完成采样即停止 两种模式
|
||||
- sample_period QDEC 采样周期选择
|
||||
- report_mode QDEC report 模式
|
||||
- report_period report 周期设置
|
||||
- led_en 随动 LED 功能使能
|
||||
- led_swap led 引脚交换
|
||||
- led_period led 输出频率
|
||||
- deglitch_en 消抖功能使能
|
||||
- deglitch_strength 消抖长度
|
||||
|
||||
``id`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
enum qdec_index_type {
|
||||
QDEC0_INDEX,
|
||||
QDEC1_INDEX,
|
||||
QDEC2_INDEX,
|
||||
QDEC_MAX_INDEX,
|
||||
};
|
||||
|
||||
``acc_mode`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
enum acc_mode_type {
|
||||
QDEC_ACC_STOP_SAMPLE_IF_OVERFLOW,
|
||||
QDEC_ACC_CONTINUE_ACCUMULATE,
|
||||
};
|
||||
|
||||
``sample_mode`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
enum sample_mode_type {
|
||||
QDEC_SAMPLE_SINGLE_MOD,
|
||||
QDEC_SAMPLE_CONTINUE_MOD,
|
||||
};
|
||||
|
||||
``report_mode`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
enum report_mode_type {
|
||||
QDEC_REPORT_SAMPLE_CHANGE_MOD,
|
||||
QDEC_REPORT_TIME_MOD,
|
||||
};
|
||||
|
||||
|
||||
QDEC 设备参数配置表
|
||||
------------------------
|
||||
|
||||
每一个 QDEC 设备都有一个参数配置宏,宏定义位于 ``bsp/board/xxx`` 目录下 ``peripheral_config.h`` 文件,变量定义位于 ``hal_qdec.c`` 中,因此无需用户自己定义变量。当用户打开对应设备的宏,该设备的配置才生效。例如打开宏 ``BSP_USING_QDEC0`` ,``QDEC0_CONFIG`` 即生效,同时 ``QDEC0_INDEX`` 设备就可以进行注册和使用了。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
/*参数配置宏*/
|
||||
#if defined(BSP_USING_QDEC0)
|
||||
#ifndef QDEC0_CONFIG
|
||||
#define QDEC0_CONFIG \
|
||||
{ \
|
||||
.id = 0, \
|
||||
.acc_mode = QDEC_ACC_CONTINUE_ACCUMULATE, \
|
||||
.sample_mode = QDEC_SAMPLE_SINGLE_MOD, \
|
||||
.sample_period = QDEC_SAMPLE_PERIOD_256US, \
|
||||
.report_mode = QDEC_REPORT_TIME_MOD, \
|
||||
.report_period = 2000, \
|
||||
.led_en = ENABLE, \
|
||||
.led_swap = DISABLE, \
|
||||
.led_period = 7, \
|
||||
.deglitch_en = DISABLE, \
|
||||
.deglitch_strength = 0x0, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(BSP_USING_QDEC1)
|
||||
#ifndef QDEC1_CONFIG
|
||||
#define QDEC1_CONFIG \
|
||||
{ \
|
||||
.id = 1, \
|
||||
.acc_mode = QDEC_ACC_CONTINUE_ACCUMULATE, \
|
||||
.sample_mode = QDEC_SAMPLE_SINGLE_MOD, \
|
||||
.sample_period = QDEC_SAMPLE_PERIOD_256US, \
|
||||
.report_mode = QDEC_REPORT_TIME_MOD, \
|
||||
.report_period = 2000, \
|
||||
.led_en = ENABLE, \
|
||||
.led_swap = DISABLE, \
|
||||
.led_period = 7, \
|
||||
.deglitch_en = DISABLE, \
|
||||
.deglitch_strength = 0x0, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(BSP_USING_QDEC2)
|
||||
#ifndef QDEC2_CONFIG
|
||||
#define QDEC2_CONFIG \
|
||||
{ \
|
||||
.id = 2, \
|
||||
.acc_mode = QDEC_ACC_CONTINUE_ACCUMULATE, \
|
||||
.sample_mode = QDEC_SAMPLE_SINGLE_MOD, \
|
||||
.sample_period = QDEC_SAMPLE_PERIOD_256US, \
|
||||
.report_mode = QDEC_REPORT_TIME_MOD, \
|
||||
.report_period = 2000, \
|
||||
.led_en = ENABLE, \
|
||||
.led_swap = DISABLE, \
|
||||
.led_period = 7, \
|
||||
.deglitch_en = DISABLE, \
|
||||
.deglitch_strength = 0x0, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*变量定义*/
|
||||
static qdec_device_t qdecx_device[QDEC_MAX_INDEX] = {
|
||||
#ifdef BSP_USING_QDEC0
|
||||
QDEC0_CONFIG,
|
||||
#endif
|
||||
#ifdef BSP_USING_QDEC1
|
||||
QDEC1_CONFIG,
|
||||
#endif
|
||||
#ifdef BSP_USING_QDEC2
|
||||
QDEC2_CONFIG,
|
||||
#endif
|
||||
};
|
||||
|
||||
.. note:: 上述配置可以通过 ``QDEC_DEV(dev)->xxx`` 进行修改,只能在调用 ``device_open`` 之前使用。
|
||||
|
||||
QDEC 设备接口
|
||||
------------------------
|
||||
|
||||
QDEC 设备接口全部遵循标准设备驱动管理层提供的接口。
|
||||
|
||||
**qdec_register**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``qdec_register`` 用来注册 QDEC 设备标准驱动接口,在注册之前需要打开对应 QDEC 设备的宏定义。例如定义宏 ``BSP_USING_QDEC0`` 方可使用 ``QDEC0_INDEX`` 设备,注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 ``QDEC0_INDEX`` 设备。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int qdec_register(enum qdec_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- name 为注册的设备命名
|
||||
|
||||
``index`` 用来选择 QDEC 设备配置,一个 index 对应一个 QDEC 设备配置,比如 ``QDEC0_INDEX`` 对应 ``QDEC0_CONFIG`` 配置,``index`` 有如下可选类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
enum qdec_index_type {
|
||||
#ifdef BSP_USING_QDEC0
|
||||
QDEC0_INDEX,
|
||||
#endif
|
||||
#ifdef BSP_USING_QDEC1
|
||||
QDEC1_INDEX,
|
||||
#endif
|
||||
#ifdef BSP_USING_QDEC2
|
||||
QDEC2_INDEX,
|
||||
#endif
|
||||
QDEC_MAX_INDEX,
|
||||
};
|
||||
|
||||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于 QDEC 设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``qdec_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
#define DEVICE_OFLAG_STREAM_TX 0x001 /* 设备以轮训发送模式打开 */
|
||||
#define DEVICE_OFLAG_STREAM_RX 0x002 /* 设备以轮训接收模式打开 */
|
||||
#define DEVICE_OFLAG_INT_TX 0x004 /* 设备以中断发送模式打开 */
|
||||
#define DEVICE_OFLAG_INT_RX 0x008 /* 设备以中断接收模式打开 */
|
||||
#define DEVICE_OFLAG_DMA_TX 0x010 /* 设备以 DMA 发送模式打开 */
|
||||
#define DEVICE_OFLAG_DMA_RX 0x020 /* 设备以 DMA 接收模式打开 */
|
||||
|
||||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``qdec_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0 表示关闭成功,其他表示错误
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对 QDEC 设备进行控制和参数的修改。实际调用 ``qdec_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 不同的控制命令返回的意义不同。
|
||||
|
||||
``args`` 根据不同的 ``cmd`` 传入不同,具体如下:
|
||||
|
||||
.. list-table:: table1
|
||||
:widths: 15 10 30
|
||||
:header-rows: 1
|
||||
|
||||
* - cmd
|
||||
- args
|
||||
- description
|
||||
* - DEVICE_CTRL_SET_INT
|
||||
- NULL
|
||||
- 开启 QDEC 中断
|
||||
* - DEVICE_CTRL_CLR_INT
|
||||
- NULL
|
||||
- 关闭 QDEC 中断
|
||||
* - DEVICE_CTRL_GET_INT
|
||||
- NULL
|
||||
- 获取当前中断状态
|
||||
* - DEVICE_CTRL_RESUME
|
||||
- NULL
|
||||
- 开启 QDEC
|
||||
* - DEVICE_CTRL_SUSPEND
|
||||
- NULL
|
||||
- 关闭 QDEC
|
||||
* - DEVICE_CTRL_GET_SAMPLE_VAL
|
||||
- NULL
|
||||
- 获取 QDEC 当前的计数值
|
||||
* - DEVICE_CTRL_GET_SAMPLE_DIR
|
||||
- NULL
|
||||
- 获取 QDEC 当前的计数方向
|
||||
* - DEVICE_CTRL_GET_ERROR_CNT
|
||||
- NULL
|
||||
- 获取 QDEC 当前的错误计数次数
|
||||
|
||||
|
||||
**device_set_callback**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_set_callback`` 用于注册一个 QDEC 中断回调函数。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_set_callback(struct device *dev, void (*callback)(struct device *dev, void *args, uint32_t size, uint32_t event));
|
||||
|
||||
- dev 设备句柄
|
||||
- callback 要注册的中断回调函数
|
||||
|
||||
- dev 设备句柄
|
||||
- args 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- size 传输长度
|
||||
- event 中断事件类型
|
||||
|
||||
QDEC 设备 ``event`` 类型如下
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
enum qdec_event_type {
|
||||
QDEC_REPORT_EVENT, /*!< report interrupt */
|
||||
QDEC_SAMPLE_EVENT, /*!< sample interrupt */
|
||||
QDEC_ERROR_EVENT, /*!< error interrupt */
|
||||
QDEC_OVERFLOW_EVENT, /*!< ACC1 and ACC2 overflow interrupt */
|
||||
QDEC_ALL_EVENT, /*!< interrupt max num */
|
||||
};
|
|
@ -38,17 +38,17 @@ SPI 设备结构体定义
|
|||
void* rx_dma;
|
||||
} spi_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- id SPI id,0 表示 SPI0
|
||||
- clk SPI 时钟频率
|
||||
- mode 主机模式或者从机模式
|
||||
- direction 传输先行模式
|
||||
- clk_polaraity 时钟极性
|
||||
- clk_phase 时钟相位
|
||||
- datasize 数据传输位宽
|
||||
- fifo_threshold fifo 阈值, 最大为 4
|
||||
- tx_dma 附加的发送 dma 句柄
|
||||
- rx_dma 附加的接收 dma 句柄
|
||||
- **parent** 继承父类属性
|
||||
- **id** SPI id,0 表示 SPI0
|
||||
- **clk** SPI 时钟频率
|
||||
- **mode** 主机模式或者从机模式
|
||||
- **direction** 传输先行模式
|
||||
- **clk_polaraity** 时钟极性
|
||||
- **clk_phase** 时钟相位
|
||||
- **datasize** 数据传输位宽
|
||||
- **fifo_threshold** fifo 阈值, 最大为 4
|
||||
- **tx_dma** 附加的发送 dma 句柄
|
||||
- **rx_dma** 附加的接收 dma 句柄
|
||||
|
||||
``mode`` 提供以下类型
|
||||
|
||||
|
@ -139,8 +139,8 @@ SPI 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
int spi_register(enum spi_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- name 为注册的设备命名
|
||||
- **index** 要注册的设备索引
|
||||
- **name** 为注册的设备命名
|
||||
|
||||
``index`` 用来选择 SPI 设备配置,一个 index 对应一个 SPI 设备配置,比如 ``SPI0_INDEX`` 对应 ``SPI0_CONFIG`` 配置,``index`` 有如下可选类型
|
||||
|
||||
|
@ -157,17 +157,17 @@ SPI 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``spi_open``。
|
||||
``device_open`` 用于打开一个 SPI 设备,实际调用 ``spi_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
``oflag`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -181,28 +181,28 @@ SPI 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``spi_close``。
|
||||
``device_close`` 用于关闭一个 SPI 设备,实际调用 ``spi_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0 表示关闭成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **return** 错误码,0 表示关闭成功,其他表示错误
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对设备进行控制和参数的修改。实际调用 ``spi_control``。
|
||||
``device_control`` 用于对 SPI 设备进行控制和参数的修改,实际调用 ``spi_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 不同的控制命令返回的意义不同。
|
||||
- **dev** 设备句柄
|
||||
- **cmd** 设备控制命令
|
||||
- **args** 控制参数
|
||||
- **return** 不同的控制命令返回的意义不同。
|
||||
|
||||
SPI 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
||||
|
||||
|
@ -262,11 +262,11 @@ SPI 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
|||
|
||||
int device_write(struct device *dev, uint32_t pos, const void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要写入的 buffer 缓冲区
|
||||
- size 要写入的长度
|
||||
- return 错误码,0 表示写入成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要写入的 buffer 缓冲区
|
||||
- **size** 要写入的长度
|
||||
- **return** 错误码,0 表示写入成功,其他表示错误
|
||||
|
||||
**device_read**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
@ -277,11 +277,11 @@ SPI 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
|||
|
||||
int device_read(struct device *dev, uint32_t pos, void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要读入的 buffer 缓冲区
|
||||
- size 要读入的长度
|
||||
- return 错误码,0 表示读入成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要读入的 buffer 缓冲区
|
||||
- **size** 要读入的长度
|
||||
- **return** 错误码,0 表示读入成功,其他表示错误
|
||||
|
||||
**device_set_callback**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -292,15 +292,15 @@ SPI 设备除了标准的控制命令,还具有自己特殊的控制命令。
|
|||
|
||||
int device_set_callback(struct device *dev, void (*callback)(struct device *dev, void *args, uint32_t size, uint32_t event));
|
||||
|
||||
- dev 设备句柄
|
||||
- callback 要注册的中断回调函数
|
||||
- **dev** 设备句柄
|
||||
- **callback** 要注册的中断回调函数
|
||||
|
||||
- dev 设备句柄
|
||||
- args 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- size 传输长度
|
||||
- event 中断事件类型
|
||||
- **dev** 设备句柄
|
||||
- **args** 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- **size** 传输长度
|
||||
- **event** 中断事件类型
|
||||
|
||||
SPI 设备 ``event`` 类型如下
|
||||
``event`` 类型如下
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -320,10 +320,10 @@ SPI 设备 ``event`` 类型如下
|
|||
|
||||
int spi_transmit(struct device *dev, void *buffer, uint32_t size, uint8_t type);
|
||||
|
||||
- dev 设备句柄
|
||||
- buffer 发送数据缓冲区
|
||||
- size 发送长度
|
||||
- type 发送位宽类型
|
||||
- **dev** 设备句柄
|
||||
- **buffer** 发送数据缓冲区
|
||||
- **size** 发送长度
|
||||
- **type** 发送位宽类型
|
||||
|
||||
``type`` 提供以下类型
|
||||
|
||||
|
@ -343,10 +343,10 @@ SPI 设备 ``event`` 类型如下
|
|||
|
||||
int spi_receive(struct device *dev, void *buffer, uint32_t size, uint8_t type);
|
||||
|
||||
- dev 设备句柄
|
||||
- buffer 接收数据缓冲区
|
||||
- size 接收长度
|
||||
- type 位宽类型
|
||||
- **dev** 设备句柄
|
||||
- **buffer** 接收数据缓冲区
|
||||
- **size** 接收长度
|
||||
- **type** 位宽类型
|
||||
|
||||
**spi_transmit_receive**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -357,8 +357,8 @@ SPI 设备 ``event`` 类型如下
|
|||
|
||||
int spi_transmit_receive(struct device *dev, const void *send_buf, void *recv_buf, uint32_t length, uint8_t type);
|
||||
|
||||
- dev 设备句柄
|
||||
- send_buf 发送数据缓冲区
|
||||
- recv_buf 接收数据缓冲区
|
||||
- length 收发长度
|
||||
- type 位宽类型
|
||||
- **dev** 设备句柄
|
||||
- **send_buf** 发送数据缓冲区
|
||||
- **recv_buf** 接收数据缓冲区
|
||||
- **length** 收发长度
|
||||
- **type** 位宽类型
|
||||
|
|
|
@ -31,14 +31,14 @@ TIMER 设备结构体定义
|
|||
uint32_t timeout3;
|
||||
} timer_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- id 定时器 id ,使能定时器 0 则 id 为 0 ,使能定时器 1 则 id 为 1 ,以此类推
|
||||
- cnt_mode 计数模式:FreeRun 和 PreLoad
|
||||
- trigger 比较器的触发源
|
||||
- reload 重装载值,只有在 PreLoad 模式下有效
|
||||
- timeout1 COMP0 超时时间,单位 us
|
||||
- timeout2 COMP1 超时时间,单位 us
|
||||
- timeout3 COMP2 超时时间,单位 us
|
||||
- **parent** 继承父类属性
|
||||
- **id** 定时器 id ,使能定时器 0 则 id 为 0 ,使能定时器 1 则 id 为 1 ,以此类推
|
||||
- **cnt_mode** 计数模式:FreeRun 和 PreLoad
|
||||
- **trigger** 比较器的触发源
|
||||
- **reload** 重装载值,只有在 PreLoad 模式下有效
|
||||
- **timeout1** COMP0 超时时间,单位 us
|
||||
- **timeout2** COMP1 超时时间,单位 us
|
||||
- **timeout3** COMP2 超时时间,单位 us
|
||||
|
||||
``ch`` 提供以下类型
|
||||
|
||||
|
@ -134,8 +134,8 @@ TIMER 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
int timer_register(enum timer_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- name 为注册的设备命名
|
||||
- **index** 要注册的设备索引
|
||||
- **name** 为注册的设备命名
|
||||
|
||||
``index`` 用来选择 TIMER 设备配置,一个 index 对应一个 TIMER 设备配置,比如 ``TIMER0_INDEX`` 对应 ``TIMER0_CONFIG`` 配置,``index`` 有如下可选类型
|
||||
|
||||
|
@ -154,17 +154,17 @@ TIMER 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于 TIMER 设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``timer_open``。
|
||||
``device_open`` 用于打开一个 TIMER 设备,实际调用 ``timer_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
``oflag`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -178,28 +178,28 @@ TIMER 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``timer_close``。
|
||||
``device_close`` 用于关闭一个 TIMER 设备,实际调用 ``timer_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0 表示关闭成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **return** 错误码,0 表示关闭成功,其他表示错误
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对 TIMER 设备进行控制和参数的修改。实际调用 ``timer_control``。
|
||||
``device_control`` 用于对 TIMER 设备的进行控制和参数的修改,实际调用 ``timer_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 不同的控制命令返回的意义不同。
|
||||
- **dev** 设备句柄
|
||||
- **cmd** 设备控制命令
|
||||
- **args** 控制参数
|
||||
- **return** 不同的控制命令返回的意义不同。
|
||||
|
||||
``args`` 根据不同的 ``cmd`` 传入不同,具体如下:
|
||||
|
||||
|
@ -211,10 +211,10 @@ TIMER 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
- args
|
||||
- description
|
||||
* - DEVICE_CTRL_SET_INT
|
||||
- NULL
|
||||
- timer_it_type
|
||||
- 开启 TIMER 中断
|
||||
* - DEVICE_CTRL_CLR_INT
|
||||
- NULL
|
||||
- timer_it_type
|
||||
- 关闭 TIMER 中断
|
||||
* - DEVICE_CTRL_GET_INT
|
||||
- NULL
|
||||
|
@ -232,36 +232,36 @@ TIMER 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_write**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_write`` 用于 Timer 设备配置超时时间。实际调用 ``timer_write``。
|
||||
``device_write`` 用于配置 TIMER 设备超时时间,实际调用 ``timer_write``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_write(struct device *dev, uint32_t pos, const void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer timer_timeout_cfg_t 句柄
|
||||
- size timer_timeout_cfg_t 个数
|
||||
- return 错误码,0 表示写入成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** timer_timeout_cfg_t 句柄
|
||||
- **size** timer_timeout_cfg_t 个数
|
||||
- **return** 错误码,0 表示写入成功,其他表示错误
|
||||
|
||||
**device_set_callback**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_set_callback`` 用于注册一个 TIMER 中断回调函数。
|
||||
``device_set_callback`` 用于注册一个 TIMER 设备中断回调函数。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_set_callback(struct device *dev, void (*callback)(struct device *dev, void *args, uint32_t size, uint32_t event));
|
||||
|
||||
- dev 设备句柄
|
||||
- callback 要注册的中断回调函数
|
||||
- **dev** 设备句柄
|
||||
- **callback** 要注册的中断回调函数
|
||||
|
||||
- dev 设备句柄
|
||||
- args 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- size 传输长度
|
||||
- event 中断事件类型
|
||||
- **dev** 设备句柄
|
||||
- **args** 无
|
||||
- **size** 无
|
||||
- **event** 中断事件类型
|
||||
|
||||
TIMER 设备 ``event`` 类型如下
|
||||
``event`` 类型如下
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
|
|
@ -34,15 +34,15 @@ UART 设备结构体定义
|
|||
void* rx_dma;
|
||||
} uart_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- id 串口 id,使能串口0则id为0,使能串口1则id为1,以此类推
|
||||
- baudrate 波特率
|
||||
- databits 数据位
|
||||
- stopbits 停止位
|
||||
- parity 校验位
|
||||
- fifo_threshold fifo 阈值,不同 mcu 最大值不同
|
||||
- tx_dma 附加的发送 dma 句柄
|
||||
- rx_dma 附加的接收 dma 句柄
|
||||
- **parent** 继承父类属性
|
||||
- **id** 串口 id,使能串口0则id为0,使能串口1则id为1,以此类推
|
||||
- **baudrate** 波特率
|
||||
- **databits** 数据位
|
||||
- **stopbits** 停止位
|
||||
- **parity** 校验位
|
||||
- **fifo_threshold** fifo 阈值,不同 mcu 最大值不同
|
||||
- **tx_dma** 附加的发送 dma 句柄
|
||||
- **rx_dma** 附加的接收 dma 句柄
|
||||
|
||||
``databits`` 提供以下类型
|
||||
|
||||
|
@ -127,8 +127,8 @@ UART 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
int uart_register(enum uart_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- name 为注册的设备命名
|
||||
- **index** 要注册的设备索引
|
||||
- **name** 为注册的设备命名
|
||||
|
||||
``index`` 用来选择 UART 设备配置,一个 index 对应一个 UART 设备配置,比如 ``UART0_INDEX`` 对应 ``UART0_CONFIG`` 配置,``index`` 有如下可选类型
|
||||
|
||||
|
@ -148,17 +148,17 @@ UART 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于 UART 设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``uart_open``。
|
||||
``device_open`` 用于打开 UART 设备,实际调用 ``uart_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0 表示打开成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0 表示打开成功,其他表示错误
|
||||
|
||||
``oflag`` 可以写入以下参数:
|
||||
``oflag`` 提供以下类型
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -172,28 +172,28 @@ UART 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``uart_close``。
|
||||
``device_close`` 用于关闭 UART 设备,实际调用 ``uart_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0 表示关闭成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **return** 错误码,0 表示关闭成功,其他表示错误
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对 UART 设备进行控制和参数的修改。实际调用 ``uart_control``。
|
||||
``device_control`` 用于对 UART 设备的进行控制和参数的修改,实际调用 ``uart_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 不同的控制命令返回的意义不同。
|
||||
- **dev** 设备句柄
|
||||
- **cmd** 设备控制命令
|
||||
- **args** 控制参数
|
||||
- **return** 不同的控制命令返回的意义不同。
|
||||
|
||||
串口设备除了标准的控制命令,还具有自己特殊的控制命令。
|
||||
|
||||
|
@ -254,11 +254,11 @@ UART 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
int device_write(struct device *dev, uint32_t pos, const void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要写入的 buffer 缓冲区
|
||||
- size 要写入的长度
|
||||
- return 错误码,0 表示写入成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要写入的 buffer 缓冲区
|
||||
- **size** 要写入的长度
|
||||
- **return** 错误码,0 表示写入成功,其他表示错误
|
||||
|
||||
**device_read**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
@ -269,30 +269,30 @@ UART 设备接口全部遵循标准设备驱动管理层提供的接口。
|
|||
|
||||
int device_read(struct device *dev, uint32_t pos, void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要读入的 buffer 缓冲区
|
||||
- size 要读入的长度
|
||||
- return 错误码,0 表示读入成功,其他表示错误
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要读入的 buffer 缓冲区
|
||||
- **size** 要读入的长度
|
||||
- **return** 错误码,0 表示读入成功,其他表示错误
|
||||
|
||||
**device_set_callback**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_set_callback`` 用于注册一个串口中断回调函数。
|
||||
``device_set_callback`` 用于注册一个 UART 设备中断回调函数。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_set_callback(struct device *dev, void (*callback)(struct device *dev, void *args, uint32_t size, uint32_t event));
|
||||
|
||||
- dev 设备句柄
|
||||
- callback 要注册的中断回调函数
|
||||
- **dev** 设备句柄
|
||||
- **callback** 要注册的中断回调函数
|
||||
|
||||
- dev 设备句柄
|
||||
- args 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- size 传输长度
|
||||
- event 中断事件类型
|
||||
- **dev** 设备句柄
|
||||
- **args** 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- **size** 传输长度
|
||||
- **event** 中断事件类型
|
||||
|
||||
串口设备 ``event`` 类型如下
|
||||
``event`` 类型如下
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
|
|
@ -28,12 +28,12 @@ USB 设备结构体定义
|
|||
void *rx_dma;
|
||||
} usb_dc_device_t;
|
||||
|
||||
- parent 继承父类属性
|
||||
- id USB id,0 表示 USB0
|
||||
- in_ep USB 输入端点的参数
|
||||
- out_ep USB 输出端点的参数
|
||||
- tx_dma 附加的发送 dma 句柄
|
||||
- rx_dma 附加的接收 dma 句柄
|
||||
- **parent** 继承父类属性
|
||||
- **id** USB id,0 表示 USB0
|
||||
- **in_ep** USB 输入端点的参数
|
||||
- **out_ep** USB 输出端点的参数
|
||||
- **tx_dma** 附加的发送 dma 句柄
|
||||
- **rx_dma** 附加的接收 dma 句柄
|
||||
|
||||
|
||||
``in_ep`` ``out_ep`` 的结构如下
|
||||
|
@ -47,9 +47,9 @@ USB 设备结构体定义
|
|||
struct usb_dc_ep_cfg ep_cfg;
|
||||
} usb_dc_ep_state_t;
|
||||
|
||||
- ep_ena 继承父类属性
|
||||
- is_stalled 挂起状态,0表示非挂起状态,1表示挂起状态
|
||||
- ep_cfg 端点的属性
|
||||
- **ep_ena** 继承父类属性
|
||||
- **is_stalled** 挂起状态,0表示非挂起状态,1表示挂起状态
|
||||
- **ep_cfg** 端点的属性
|
||||
|
||||
|
||||
``ep_cfg`` 的结构如下
|
||||
|
@ -62,9 +62,9 @@ USB 设备结构体定义
|
|||
uint8_t ep_type;
|
||||
};
|
||||
|
||||
- ep_addr 端点的地址
|
||||
- ep_mps 端点最大 packet 长度
|
||||
- ep_type 端点传输类型
|
||||
- **ep_addr** 端点的地址
|
||||
- **ep_mps** 端点最大 packet 长度
|
||||
- **ep_type** 端点传输类型
|
||||
|
||||
|
||||
.. note:: 以上参数无需用户配置
|
||||
|
@ -77,54 +77,54 @@ USB 设备接口遵循标准设备驱动管理层提供的接口。
|
|||
**usb_dc_register**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``usb_dc_register`` 用来注册 USB 设备标准驱动接口,在注册之前需要打开对应 USB 设备的宏定义,例如定义宏 ``BSP_USING_USB`` 方可使用 USB 设备。注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 USB 设备。
|
||||
``usb_dc_register`` 用来注册一个 USB 从设备标准驱动接口,在注册之前需要打开对应 USB 设备的宏定义,例如定义宏 ``BSP_USING_USB`` 方可使用 USB 设备。注册完成以后才可以使用其他接口,如果没有定义宏,则无法使用 USB 设备。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int usb_dc_register(enum usb_index_type index, const char *name);
|
||||
|
||||
- index 要注册的设备索引
|
||||
- name 为注册的设备命名
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **index** 要注册的设备索引
|
||||
- **name** 为注册的设备命名
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
**device_open**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_open`` 用于设备的打开,``oflag`` 表示以何种方式打开。实际调用 ``usb_open``。
|
||||
``device_open`` 用于打开一个 USB 设备,实际调用 ``usb_open``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_open(struct device *dev, uint16_t oflag);
|
||||
|
||||
- dev 设备句柄
|
||||
- oflag 设备的打开方式
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备句柄
|
||||
- **oflag** 设备的打开方式
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
**device_close**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_close`` 用于设备的关闭。实际调用 ``usb_close``。
|
||||
``device_close`` 用于关闭一个 USB 设备,实际调用 ``usb_close``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_close(struct device *dev);
|
||||
|
||||
- dev 设备句柄
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备句柄
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
**device_control**
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``device_control`` 用于根据命令对设备进行控制和参数的修改。实际调用 ``usb_control``。
|
||||
``device_control`` 用于对 USB 设备的进行控制和参数的修改,实际调用 ``usb_control``。
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
int device_control(struct device *dev, int cmd, void *args);
|
||||
|
||||
- dev 设备句柄
|
||||
- cmd 设备控制命令
|
||||
- args 控制参数
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备句柄
|
||||
- **cmd** 设备控制命令
|
||||
- **args** 控制参数
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
USB 设备除了标准的控制命令,还具有私有的控制命令。
|
||||
|
||||
|
@ -135,6 +135,9 @@ USB 设备除了标准的控制命令,还具有私有的控制命令。
|
|||
* - cmd
|
||||
- args
|
||||
- description
|
||||
* - DEVICE_CTRL_SET_INT
|
||||
- uint32_t
|
||||
- 开启 USB 中断
|
||||
* - DEVICE_CTRL_USB_DC_SET_ACK
|
||||
- uint32_t
|
||||
- 设置 USB 设备 ACK 状态
|
||||
|
@ -163,20 +166,6 @@ USB 设备除了标准的控制命令,还具有私有的控制命令。
|
|||
- uint32_t
|
||||
- 开启 USB 设备通过 dma 接收
|
||||
|
||||
``args`` 支持的标准控制命令 ``cmd`` 具体如下:
|
||||
|
||||
.. list-table:: table2
|
||||
:widths: 15 10 30
|
||||
:header-rows: 1
|
||||
|
||||
* - cmd
|
||||
- args
|
||||
- description
|
||||
* - DEVICE_CTRL_SET_INT
|
||||
- uint32_t
|
||||
- 开启 USB 中断
|
||||
|
||||
|
||||
**device_write**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
|
@ -186,11 +175,11 @@ USB 设备除了标准的控制命令,还具有私有的控制命令。
|
|||
|
||||
int device_write(struct device *dev, uint32_t pos, const void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要写入的 buffer 缓冲区
|
||||
- size 要写入的长度
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要写入的 buffer 缓冲区
|
||||
- **size** 要写入的长度
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
**device_read**
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
@ -201,11 +190,11 @@ USB 设备除了标准的控制命令,还具有私有的控制命令。
|
|||
|
||||
int device_read(struct device *dev, uint32_t pos, void *buffer, uint32_t size);
|
||||
|
||||
- dev 设备句柄
|
||||
- pos 无作用
|
||||
- buffer 要读入的 buffer 缓冲区
|
||||
- size 要读入的长度
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备句柄
|
||||
- **pos** 无作用
|
||||
- **buffer** 要读入的 buffer 缓冲区
|
||||
- **size** 要读入的长度
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
**device_set_callback**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -216,16 +205,16 @@ USB 设备除了标准的控制命令,还具有私有的控制命令。
|
|||
|
||||
int device_set_callback(struct device *dev, void (*callback)(struct device *dev, void *args, uint32_t size, uint32_t event));
|
||||
|
||||
- dev 设备句柄
|
||||
- callback 要注册的中断回调函数
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备句柄
|
||||
- **callback** 要注册的中断回调函数
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
- dev 设备句柄
|
||||
- args 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- size 传输长度
|
||||
- event 中断事件类型
|
||||
- **dev** 设备句柄
|
||||
- **args** 接收发送缓冲区,数据类型为 uint8_t*
|
||||
- **size** 传输长度
|
||||
- **event** 中断事件类型
|
||||
|
||||
USB 设备 ``event`` 类型如下
|
||||
``event`` 类型如下
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
|
@ -270,10 +259,10 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_send_from_ringbuffer(struct device *dev, Ring_Buffer_Type *rb, uint8_t ep);
|
||||
|
||||
- dev 设备指针
|
||||
- rb rinbuffer 结构体指针
|
||||
- ep 端点地址
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备指针
|
||||
- **rb** rinbuffer 结构体指针
|
||||
- **ep** 端点地址
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
**usb_dc_receive_to_ringbuffer**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -284,10 +273,10 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_receive_to_ringbuffer(struct device *dev, Ring_Buffer_Type *rb, uint8_t ep);
|
||||
|
||||
- dev 设备指针
|
||||
- rb rinbuffer 结构体指针
|
||||
- ep 端点地址
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **dev** 设备指针
|
||||
- **rb** rinbuffer 结构体指针
|
||||
- **ep** 端点地址
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
.. important:: 以下函数为 USB Device 协议栈需要实现的 porting 接口,用户无需在应用层调用。
|
||||
|
||||
|
@ -302,8 +291,8 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_set_address(const uint8_t addr);
|
||||
|
||||
- addr USB 设备的地址
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **addr** USB 设备的地址
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
.. _usb_dc_ep_open:
|
||||
|
||||
|
@ -316,8 +305,8 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_ep_open(const struct usbd_endpoint_cfg *ep_cfg);
|
||||
|
||||
- ep_cfg 端点的属性
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **ep_cfg** 端点的属性
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
.. _usb_dc_ep_close:
|
||||
|
||||
|
@ -330,8 +319,8 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_ep_close(const uint8_t ep);
|
||||
|
||||
- ep 端点地址
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **ep** 端点地址
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
.. _usb_dc_ep_set_stall:
|
||||
|
||||
|
@ -344,8 +333,8 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_ep_set_stall(const uint8_t ep);
|
||||
|
||||
- ep 端点地址
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **ep** 端点地址
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
.. _usb_dc_ep_clear_stall:
|
||||
|
||||
|
@ -358,8 +347,8 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_ep_clear_stall(const uint8_t ep);
|
||||
|
||||
- ep 端点地址
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **ep** 端点地址
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
.. _usb_dc_ep_is_stalled:
|
||||
|
||||
|
@ -372,9 +361,9 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_ep_is_stalled(const uint8_t ep, uint8_t *stalled);
|
||||
|
||||
- ep 端点id
|
||||
- stalled 保存挂起状态的地址, 0 表示非挂起状态, 1 表示挂起状态
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **ep** 端点id
|
||||
- **stalled** 保存挂起状态的地址, 0 表示非挂起状态, 1 表示挂起状态
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
.. _usb_dc_ep_write:
|
||||
|
||||
|
@ -387,11 +376,11 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_ep_write(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint32_t *ret_bytes);
|
||||
|
||||
- ep 端点地址
|
||||
- data 要发送的数据地址
|
||||
- data_len 要发送数据的长度
|
||||
- ret_bytes 实际成功发生的数据长度
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **ep** 端点地址
|
||||
- **data** 要发送的数据地址
|
||||
- **data_len** 要发送数据的长度
|
||||
- **ret_bytes** 实际成功发生的数据长度
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
||||
.. _usb_dc_ep_read:
|
||||
|
||||
|
@ -404,8 +393,8 @@ USB 设备 ``event`` 类型如下
|
|||
|
||||
int usb_dc_ep_read(const uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_t *read_bytes);
|
||||
|
||||
- ep 端点地址
|
||||
- data 要接收数据的地址
|
||||
- data_len 要接收数据的长度,不能大于最大包长
|
||||
- ret_bytes 实际成功接收的数据长度
|
||||
- return 错误码,0表示成功,其他表示失败
|
||||
- **ep** 端点地址
|
||||
- **data** 要接收数据的地址
|
||||
- **data_len** 要接收数据的长度,不能大于最大包长
|
||||
- **ret_bytes** 实际成功接收的数据长度
|
||||
- **return** 错误码,0表示成功,其他表示失败
|
||||
|
|
|
@ -16,4 +16,5 @@ Peripheral
|
|||
ADC 设备 <api_adc>
|
||||
DAC 设备 <api_dac>
|
||||
TIMER 设备 <api_timer>
|
||||
QDEC 设备 <api_qdec>
|
||||
USB 设备 <api_usb>
|
|
@ -35,7 +35,7 @@ Shell 接口
|
|||
|
||||
void shell_handler(uint8_t data);
|
||||
|
||||
- data 接收的数据
|
||||
- **data** 接收的数据
|
||||
|
||||
**SHELL_CMD_EXPORT**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -44,8 +44,8 @@ Shell 接口
|
|||
|
||||
.. c:macro:: SHELL_CMD_EXPORT(command, desc)
|
||||
|
||||
- command 注册的函数名,后面输入 command 来运行该函数
|
||||
- desc 对该函数的描述
|
||||
- **command** 注册的函数名,后面输入 command 来运行该函数
|
||||
- **desc** 对该函数的描述
|
||||
|
||||
**SHELL_CMD_EXPORT_ALIAS**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -54,9 +54,9 @@ Shell 接口
|
|||
|
||||
.. c:macro:: SHELL_CMD_EXPORT_ALIAS(command, alias, desc)
|
||||
|
||||
- command 注册的函数名
|
||||
- alias 函数名的别名,后面输入 alias 来运行该函数
|
||||
- desc 对该函数的描述
|
||||
- **command** 注册的函数名
|
||||
- **alias** 函数名的别名,后面输入 alias 来运行该函数
|
||||
- **desc** 对该函数的描述
|
||||
|
||||
Shell 内置命令
|
||||
-----------------
|
||||
|
|
|
@ -49,7 +49,7 @@ USB DEVICE 控制器接口
|
|||
return usb;
|
||||
}
|
||||
|
||||
- device 返回 USB 设备句柄
|
||||
- **device** 返回 USB 设备句柄
|
||||
|
||||
.. note::中断处理函数则是调用 ``usbd_event_notify_handler``
|
||||
|
||||
|
@ -68,7 +68,7 @@ USB DEVICE 通用接口
|
|||
|
||||
void usbd_desc_register(const uint8_t *desc);
|
||||
|
||||
- desc 描述符的句柄
|
||||
- **desc** 描述符的句柄
|
||||
|
||||
|
||||
**usbd_msosv1_desc_register**
|
||||
|
@ -80,7 +80,7 @@ USB DEVICE 通用接口
|
|||
|
||||
void usbd_msosv1_desc_register(struct usb_msosv1_descriptor *desc);
|
||||
|
||||
- desc 描述符句柄
|
||||
- **desc** 描述符句柄
|
||||
|
||||
|
||||
**usbd_class_add_interface**
|
||||
|
@ -92,8 +92,8 @@ USB DEVICE 通用接口
|
|||
|
||||
void usbd_class_add_interface(usbd_class_t *class, usbd_interface_t *intf);
|
||||
|
||||
- class USB 设备类的句柄
|
||||
- intf USB 设备接口的句柄
|
||||
- **class** USB 设备类的句柄
|
||||
- **intf** USB 设备接口的句柄
|
||||
|
||||
``usbd_class_t`` 定义如下
|
||||
|
||||
|
@ -105,9 +105,9 @@ USB DEVICE 通用接口
|
|||
usb_slist_t intf_list;
|
||||
} usbd_class_t;
|
||||
|
||||
- list 类的链表节点
|
||||
- name 类的名称
|
||||
- intf_list 接口的链表节点
|
||||
- **list** 类的链表节点
|
||||
- **name** 类的名称
|
||||
- **intf_list** 接口的链表节点
|
||||
|
||||
``usbd_interface_t`` 定义如下
|
||||
|
||||
|
@ -127,13 +127,13 @@ USB DEVICE 通用接口
|
|||
usb_slist_t ep_list;
|
||||
} usbd_interface_t;
|
||||
|
||||
- list 接口的链表节点
|
||||
- class_handler class setup 请求回调函数
|
||||
- vendor_handler vendor setup 请求回调函数
|
||||
- custom_handler custom setup 请求回调函数
|
||||
- notify_handler 中断标志、协议栈相关状态回调函数
|
||||
- intf_num 当前接口偏移
|
||||
- ep_list 端点的链表节点
|
||||
- **list** 接口的链表节点
|
||||
- **class_handler** class setup 请求回调函数
|
||||
- **vendor_handler** vendor setup 请求回调函数
|
||||
- **custom_handler** custom setup 请求回调函数
|
||||
- **notify_handler** 中断标志、协议栈相关状态回调函数
|
||||
- **intf_num** 当前接口偏移
|
||||
- **ep_list** 端点的链表节点
|
||||
|
||||
**usbd_interface_add_endpoint**
|
||||
""""""""""""""""""""""""""""""""""""
|
||||
|
@ -145,8 +145,8 @@ USB DEVICE 通用接口
|
|||
void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep);
|
||||
|
||||
|
||||
- intf USB 设备接口的句柄
|
||||
- ep USB 设备端点的句柄
|
||||
- **intf** USB 设备接口的句柄
|
||||
- **ep** USB 设备端点的句柄
|
||||
|
||||
``usbd_class_t`` 定义如下
|
||||
|
||||
|
@ -158,9 +158,9 @@ USB DEVICE 通用接口
|
|||
usbd_endpoint_callback ep_cb;
|
||||
} usbd_endpoint_t;
|
||||
|
||||
- list 端点的链表节点
|
||||
- ep_addr 端点地址
|
||||
- ep_cb 端点中断回调函数
|
||||
- **list** 端点的链表节点
|
||||
- **ep_addr** 端点地址
|
||||
- **ep_cb** 端点中断回调函数
|
||||
|
||||
**usb_device_is_configured**
|
||||
""""""""""""""""""""""""""""""""""""
|
||||
|
@ -171,7 +171,7 @@ USB DEVICE 通用接口
|
|||
|
||||
bool usb_device_is_configured(void);
|
||||
|
||||
- return 配置状态, 0 表示未配置, 1 表示配置成功
|
||||
- **return** 配置状态, 0 表示未配置, 1 表示配置成功
|
||||
|
||||
|
||||
USB Device CDC 类接口
|
||||
|
@ -187,8 +187,8 @@ USB Device CDC 类接口
|
|||
|
||||
void usbd_cdc_add_acm_interface(usbd_class_t *class, usbd_interface_t *intf);
|
||||
|
||||
- class 类的句柄
|
||||
- intf 接口句柄
|
||||
- **class** 类的句柄
|
||||
- **intf** 接口句柄
|
||||
|
||||
USB Device MSC 类接口
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -201,8 +201,8 @@ USB Device MSC 类接口
|
|||
|
||||
void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep);
|
||||
|
||||
- out_ep 输出端点的地址
|
||||
- in_ep 输入端点的地址
|
||||
- **out_ep** 输出端点的地址
|
||||
- **in_ep** 输入端点的地址
|
||||
|
||||
|
||||
USB Device HID 类接口
|
||||
|
@ -218,8 +218,8 @@ USB Device HID 类接口
|
|||
|
||||
void usbd_hid_add_interface(usbd_class_t *class, usbd_interface_t *intf);
|
||||
|
||||
- class 类的句柄
|
||||
- intf 接口句柄
|
||||
- **class** 类的句柄
|
||||
- **intf** 接口句柄
|
||||
|
||||
|
||||
USB Device AUDIO 类接口
|
||||
|
@ -233,8 +233,8 @@ USB Device AUDIO 类接口
|
|||
|
||||
void usbd_audio_add_interface(usbd_class_t *class, usbd_interface_t *intf);
|
||||
|
||||
- class 类的句柄
|
||||
- intf 接口句柄
|
||||
- **class** 类的句柄
|
||||
- **intf** 接口句柄
|
||||
|
||||
|
||||
USB Device VIDEO 类接口
|
||||
|
@ -248,5 +248,5 @@ USB Device VIDEO 类接口
|
|||
|
||||
void usbd_video_add_interface(usbd_class_t *class, usbd_interface_t *intf);
|
||||
|
||||
- class 类的句柄
|
||||
- intf 接口句柄
|
||||
- **class** 类的句柄
|
||||
- **intf** 接口句柄
|
Loading…
Add table
Add a link
Reference in a new issue