跳转至

LPUART

模块介绍

LPUART 驱动主要实现设备驱动的底层细节,并为上层提供一套标准的 API 接口以供使用。

模块配置

配置路径如下:

Kernel Setup --->
    Drivers Setup --->
        SoC HAL Drivers --->
            LPUART Devices --->
                [*] enable lpuart driver

源码结构

LPUART 模块源码结构如下所示:

hal/source/lpuart/             ---- 驱动源码
├── hal_lpuart.c
├── Kconfig
├── Makefile
├── platform
│   ├── lpuart-sun20iw2p1.h    ---- 平台地址,引脚复用等配置
│   └── ...
├── platform-lpuart.h
└── lpuart.h
include/hal/                   ---- 驱动APIs声明头文件
└── hal_lpuart.h

模块接口说明

需要包含头文件

#include <hal_lpuart.h>

初始化 LPUART 驱动

函数原型:

int32_t hal_lpuart_init(int32_t lpuart_port)

参数:

  • lpuart_port:LPUART 端口号

返回值:

  • SUNXI_HAL_OK: 成功
  • HAL_LPUART_STATUS_ERROR: 失败

卸载 LPUART 驱动

函数原型:

int32_t hal_lpuart_deinit(int32_t lpuart_port)

参数:

  • lpuart_port:LPUART 端口号

返回值:

  • SUNXI_HAL_OK: 成功

设置波特率及参数

函数原型:

int32_t hal_lpuart_control(lpuart_port_t lpuart_port, int cmd, void *args)

参数:

  • lpuart_port_t:LPUART 端口号
  • cmd:预留,暂未使用
  • args:指向 _lpuart_config_t 类型变量的数组

返回值:

  • SUNXI_HAL_OK: 成功
  • HAL_LPUART_STATUS_ERROR: 失败

接收处理

函数原型:

int32_t hal_lpuart_receive(int32_t dev, uint8_t *data, uint32_t num)

参数:

  • dev:LPUART 端口号
  • data: 接收数据缓冲区
  • num: 接收数据长度

返回值:

  • size: 成功接收的字节数

接收对比处理

函数原型:

int32_t hal_lpuart_rx_cmp(lpuart_port_t lpuart_port, uint8_t cmp_len, uint8_t *cmp_data);

参数:

  • lpuart_port:LPUART 端口号
  • cmp_len:比较数据的长度
  • cmp_data:比较的数据

返回值:

  • SUNXI_HAL_OK: 成功
  • HAL_LPUART_STATUS_ERROR: 失败

启用接收对比处理回调

函数原型:

int32_t hal_lpuart_enable_rx_cmp(lpuart_port_t lpuart_port, lpuart_callback_t cb, void *arg);

参数:

  • lpuart_port:LPUART 端口号
  • cb:处理回调函数
  • arg:回调函数的参数

返回值:

  • SUNXI_HAL_OK: 成功
  • HAL_LPUART_STATUS_ERROR: 失败

禁用接收对比处理回调

函数原型:

int32_t hal_lpuart_disable_rx_cmp(lpuart_port_t lpuart_port);

参数:

  • lpuart_port:LPUART 端口号

返回值:

  • SUNXI_HAL_OK: 成功
  • HAL_LPUART_STATUS_ERROR: 失败

配置PM绕过模式

函数原型:

int32_t HAL_LPUART_SetBypassPmMode(lpuart_port_t lpuart_port, uint8_t mode);

参数:

  • lpuart_port:LPUART 端口号
  • mode:配置模式

返回值:

  • SUNXI_HAL_OK: 成功
  • HAL_LPUART_STATUS_ERROR: 失败

模块使用范例

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <hal_log.h>
#include <hal_cmd.h>
#include <hal_timer.h>
#include <hal_lpuart.h>
#include <hal_uart.h>

/* find a free uart_port or pc com as source */
#define UART_TEST UART_1
#define TEST_LEN 5

static void cmd_usage(void)
{
    printf("Usage:\n"
        "\t hal_lpuart <port> <baudrate>\n");
}

void test_recv_data(lpuart_port_t port)
{
    printf("enter recv data test\n");
    hal_lpuart_enable_rx_data(port, NULL, NULL);
    /* use uart as source */
    hal_uart_init(UART_TEST);
    hal_uart_send(UART_TEST, "a", 1);
    /* use pc com as source */
    printf("enter\n");
    hal_sleep(5);
    hal_lpuart_disable_rx_data(port);
}

static void compare_callback(void *arg)
{
    printf("data compare success!\n");
}

void test_cmp_data(lpuart_port_t port)
{
    printf("enter cmp data test\n");
    char cmp[TEST_LEN + 1] = "abcde";

    if (hal_lpuart_init(port)) {
        printf("lpuart %d not inited\n", port);
        return;
    }

    hal_lpuart_rx_cmp(port, TEST_LEN, cmp);
    hal_lpuart_enable_rx_cmp(port, compare_callback, NULL);
    /* use uart as source, stop bit of uart should be 2 */
    hal_uart_init(UART_TEST);
    hal_uart_send(UART_TEST, cmp, TEST_LEN);
    /* use pc com as source */
    printf("enter abcde\n");
    hal_sleep(5);
    hal_lpuart_disable_rx_cmp(port);
}

void lpuart_reset_multiplex()
{
    lpuart_multiplex(LPUART_0, UART_0);
    lpuart_multiplex(LPUART_1, UART_1);
}

int cmd_test_lpuart(int argc, char **argv)
{
    if (argc != 3) {
        cmd_usage();
        return -1;
    }

    lpuart_port_t port;
    uint32_t baudrate;

    port = strtol(argv[1], NULL, 0);
    baudrate = strtol(argv[2], NULL, 0);

    if (hal_lpuart_init(port) != SUNXI_HAL_OK) {
        printf("Fail to init lpuart\n");
        return -1;
    }

    if (port == 0) {
        lpuart_multiplex(LPUART_0, UART_TEST);
    } else if (port == 1) {
        lpuart_multiplex(LPUART_1, UART_TEST);
    }
    test_recv_data(port);
    test_cmp_data(port);

    lpuart_reset_multiplex();

    return 0;
}

FINSH_FUNCTION_EXPORT_CMD(cmd_test_lpuart, hal_lpuart, lpuart hal APIs tests)