[Android13|12] 如何写自己的 hal 代码以及测试代码? 如何写访问驱动demo代码

代码总体结构: 

hardware/libhardware/include/hardware/hello.h

hardware/libhardware/modules/hello/Android.bp

hardware/libhardware/modules/hello/hello.c

hardware/libhardware/modules/hello/HelloTest.cpp

hello.h

#include <sys/cdefs.h>
#include <sys/types.h>
#include <hardware/hardware.h>
//HAL模块名
#define HELLO_HARDWARE_MODULE_ID "hello"
//HAL版本号
#define HELLO_MODULE_API_VERSION_1_0 HARDWARE_MODULE_API_VERSION(0, 1)
//设备名
#define HARDWARE_HELLO "hello"

#define SPRD_BACKLIGHT_PATH "/sys/class/backlight/sprd_backlight/brightness"
#define ERR_BUF_MAX 64

//自定义HAL模块结构体
typedef struct hello_module {
    struct hw_module_t common;
} hello_module_t;

//自定义HAL设备结构体
typedef struct hello_device {
    struct hw_device_t common;
    //加法函数
    int (*additionTest)(const struct hello_device *dev,int a,int b,int* total);
	int (*sysfsWrite)(const char * path,char * buf);
} hello_device_t;

//给外部调用提供打开设备的函数
static inline int _hello_open(const struct hw_module_t *module,
        hello_device_t **device) {
    return module->methods->open(module, HARDWARE_HELLO,
            (struct hw_device_t **) device);
}

hardware/libhardware/modules/hello/Android.bp

​
cc_library_shared {
    name: "hello.default",
    relative_install_path: "hw",
    proprietary: true,
    srcs: ["hello.c"],
    header_libs: ["libhardware_headers"],
    shared_libs: ["liblog"],
}

cc_binary {
    name: "hardware_HelloTest",
    srcs: ["HelloTest.cpp"],
    shared_libs: [
        "liblog",
        "libhardware",
    ],
}

​

hardware/libhardware/modules/hello/hello.c

#define LOG_TAG "HelloHal"

#include <malloc.h>
#include <stdint.h>
#include <string.h>

#include <log/log.h>

#include <hardware/hello.h>
#include <hardware/hardware.h>


static int sysfsWrite(const char * path,char * buf)
{
	char err_buf[ERR_BUF_MAX];
    int size;
    int fd;
	//int errno;

    fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0644);
    if (fd < 0) {
        //strerror_r(errno, err_buf, sizeof(err_buf));
        ALOGE("Error open %s: %s\n", path, err_buf);
        return -1 ;
    }

    //LOGE(" %s -> buf = %s ",__FUNCTION__,buf);

    size = write(fd, buf, strlen(buf));
    if (size < 0) {
        //strerror_r(errno, err_buf, sizeof(err_buf));
        ALOGE("Error write %s: %s\n", path, err_buf);
    }
    close(fd);
    return size;
}

//加法函数实现
static int additionTest(const struct hello_device *dev,int a,int b,int *total)
{
	if(!dev){
		return -1;
	}
    *total = a + b;
    return 0;
}

//关闭设备函数
static int hello_close(hw_device_t *dev)
{
    if (dev) {
        free(dev);
        return 0;
    } else {
        return -1;
    }
}
//打开设备函数
static int hello_open(const hw_module_t* module,const char __unused *id,
                            hw_device_t** device)
{
    if (device == NULL) {
        ALOGE("NULL hello device on open");
        return -1;
    }

    hello_device_t *dev = malloc(sizeof(hello_device_t));
    memset(dev, 0, sizeof(hello_device_t));

    dev->common.tag = HARDWARE_DEVICE_TAG;
    dev->common.version = HELLO_MODULE_API_VERSION_1_0;
    dev->common.module = (struct hw_module_t*) module;
    dev->common.close = hello_close;
    dev->additionTest = additionTest;
	dev->sysfsWrite   = sysfsWrite;

    *device = &(dev->common);
    return 0;
}

static struct hw_module_methods_t hello_module_methods = {
    .open = hello_open,
};
//导出符号HAL_MODULE_INFO_SYM,指向自定义模块
hello_module_t HAL_MODULE_INFO_SYM = {
    .common = {
        .tag                = HARDWARE_MODULE_TAG,
        .module_api_version = HELLO_MODULE_API_VERSION_1_0,
        .hal_api_version    = HARDWARE_HAL_API_VERSION,
        .id                 = HELLO_HARDWARE_MODULE_ID,
        .name               = "Hello HAL",
        .author             = "Hello",
        .methods            = &hello_module_methods,
    },
};

hardware/libhardware/modules/hello/HelloTest.cpp

#include <hardware/hardware.h>
#include <hardware/hello.h>
#include <log/log.h>
#define TAG "HelloHal"
int main(){
    hello_device_t* hello_device = NULL;

    const hello_module_t * module = NULL;

    int ret = hw_get_module(HELLO_HARDWARE_MODULE_ID,(const struct hw_module_t**)&module);
    if (!ret) {
		ALOGD("get hello-hal failed....... 1");
        ret = _hello_open((const struct hw_module_t*)module,&hello_device);
    }

   
    if (ret < 0) {
          ALOGD("get hello-hal failed....... 2");
          return -1;
    }

    int total = 0;
	char val[3] = {'2','5','5'};
    hello_device->additionTest(hello_device,3,5,&total);
	hello_device->sysfsWrite(SPRD_BACKLIGHT_PATH,val);
    ALOGD("success start hello-hal....total = %d",total);
    return 0;
}

成果演示:

/system/bin # ./hardware_HelloTest

07-19 22:02:52.073  5265  5265 D hardware_HelloTest: get hello-hal failed....... 1
07-19 22:02:52.074  5265  5265 D hardware_HelloTest: success start hello-hal....total = 8
07-19 22:03:09.656  5328  5328 D hardware_HelloTest: get hello-hal failed....... 1
07-19 22:03:09.657  5328  5328 D hardware_HelloTest: success start hello-hal....total = 8
07-19 22:03:11.853  5329  5329 D hardware_HelloTest: get hello-hal failed....... 1
07-19 22:03:11.853  5329  5329 D hardware_HelloTest: success start hello-hal....total = 8
07-19 22:03:37.192  5397  5397 D hardware_HelloTest: get hello-hal failed....... 1
07-19 22:03:37.193  5397  5397 D hardware_HelloTest: success start hello-hal....total = 8

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的HAL驱动USART的代码示例: ```c #include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==USART2) { /* USART2 clock enable */ __HAL_RCC_USART2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART2 interrupt Init */ HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); } } void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) { if(uartHandle->Instance==USART2) { /* Peripheral clock disable */ __HAL_RCC_USART2_CLK_DISABLE(); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); /* USART2 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART2_IRQn); } } void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2); } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart2) { // 处理接收数据 } } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart2) { // 处理发送完成 } } ``` 以上代码中,我们使用了HAL库提供的函数来初始化USART2串口,并实现了中断回调函数,处理串口的接收和发送完成事件。具体可以根据实际需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值