zoukankan      html  css  js  c++  java
  • TQ210搭载Android4.0.3系统构建之ADC从驱动到HAL到JNI到应用程序(HAL篇)

       其实ADC的HAL层和BEEP、LED的就HAL层很像,所以注释就很少了,详情见BEEP、LED的HAL层

       直接上源码吧

       adc_under_hal.h

        

    #ifndef __ADC_UNDER_H
    #define __ADC_UNDER_H
    
    #include <hardware/hardware.h>
    #include <stdint.h>
    #include <sys/cdefs.h>
    
    __BEGIN_DECLS //采用C语言的方式编译和连接变量与函数
    #define ADC_UNDER_ID "adc_unders"
    
    static struct adc_hw_module_t
    {
    	struct hw_module_t common;
    };
    
    static struct adc_hw_device_t
    {
    	struct hw_device_t common;
    	int (*read)(struct adc_hw_device_t *device);
    };
    
    __END_DECLS
    #endif
    


    adc_under_hal.c

    #include <hardware/hardware.h>
    #include <hardware/adc_under_hal.h>
    #include <android/log.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define DEVICE_NAME "/dev/adc_unders"  //设备文件
    
    int fd=-1;
    
    int adc_open()  //打开设备文件
    {
    	fd=open(DEVICE_NAME,O_RDWR);
    	if(fd<0)
    		{
    			__android_log_print(ANDROID_LOG_DEBUG, "msg", "can not open fd,fd=%d.
    ",fd);
    			return -1;
    	       }
    	__android_log_print(ANDROID_LOG_DEBUG,"msg", "open fd success,fd=%d
    ",fd);
    	return 0;
    }
    
    int adc_read(struct adc_hw_device_t *dev)  //读取adc数据
    {
    	int data=0,ret;
    	if(fd==-1) return -1;
    	ret=read(fd,&data,sizeof(&data));
    	if(ret<0) __android_log_print(ANDROID_LOG_DEBUG,"msg", "can not read data from kernel.
    ");
    	return data;
    }
    
    int adc_close(struct hw_device_t *dev)
    {
    	if(fd!=-1)
    		{
    			close(fd);
    			if(dev) free(dev);
    		}
    	return 0;
    }
    
    int adc_init(struct hw_module_t *module,const char *id,struct hw_device_t **device) //adc的初始化函数,将设备带回给device
    {
    	struct adc_hw_device_t *dev;
    	dev=(struct adc_hw_device_t *)malloc(sizeof(struct adc_hw_device_t));
    	if(dev==NULL)
    		{
    		__android_log_print(ANDROID_LOG_DEBUG, "msg", "can not alloc mem.
    ");
    		return -1;
    		}
    	memset(dev,0,sizeof(*dev));  
    	dev->common.tag=HARDWARE_DEVICE_TAG; //初始化设备信息
    	dev->common.version=1;
    	dev->common.module=module;
    	dev->common.close=(int (*)(struct hw_device_t *))adc_close;
    
    	*device=(struct hw_device_t *)&dev->common;
    
    	dev->read=adc_read;
    
    	if(adc_open()==-1)  //打开设备文件
    		{
    			free(dev);
    			dev=NULL;
    			return -1;
    		}
    	return 0;
    	
    }
    
    static struct hw_module_methods_t adc_module_methods_t=
    {
    	open:adc_init
    };
    
    
    const struct adc_hw_module_t HAL_MODULE_INFO_SYM=  //模块的入口,HMI符号
    {
    	common:
    			{
    				tag:HARDWARE_MODULE_TAG,
    				version_major:1,
    				version_minor:0,
    				id:ADC_UNDER_ID, //组成模块名称的ID
    				name:"adc stub",
    				author:"undergrowth",
    				methods:&adc_module_methods_t,
    			}
    
    };
    


    编译文件 Android.mk

    LOCAL_PATH	:=$(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_PRELINK_MODULE	:=false
    LOCAL_SHARED_LIBRARIES	:=libutils 
    LOCAL_SRC_FILES 	:=adc_under_hal.c
    LOCAL_MODULE		:=adc_unders.$(TARGET_BOARD_PLATFORM)
    LOCAL_MODULE_PATH	:=$(LOCAL_PATH)
    LOCAL_MODULE_TAGS	:=optional
    include $(BUILD_SHARED_LIBRARY)
    
    
    


  • 相关阅读:
    ubuntu 安装 redis desktop manager
    ubuntu 升级内核
    Ubuntu 内核升级,导致无法正常启动
    spring mvc 上传文件,但是接收到文件后发现文件变大,且文件打不开(multipartfile)
    angular5 open modal
    POJ 1426 Find the Multiple(二维DP)
    POJ 3093 Margritas
    POJ 3260 The Fewest Coins
    POJ 1837 Balance(二维DP)
    POJ 1337 A Lazy Worker
  • 原文地址:https://www.cnblogs.com/liangxinzhi/p/4275623.html
Copyright © 2011-2022 走看看