fsl Camera调试第二篇 CameraHal.cpp

          CameraHal.cpp文件需要修改;一般CameraModule.cpp的调用函数实际都是CameraHal.cpp实现的;

CAMERA_HAL_RET CameraHal :: setCaptureDevice(sp<CaptureDeviceInterface> capturedevice)
    {
        CAMERA_LOG_FUNC;
        CAMERA_HAL_RET ret = CAMERA_HAL_ERR_NONE;
        if (mCameraReady == false)
			//capturedevice是从CameraModule.cpp传递过来的;
			//CameraHal.cpp文件所有的操作都是针对mCaptureDevice;你要添加代码也对它操作;
            mCaptureDevice = capturedevice;
        else
            ret = CAMERA_HAL_ERR_BAD_ALREADY_RUN;
        return ret;
    }

 CAMERA_HAL_RET CameraHal::Init()
    {
        CAMERA_LOG_FUNC;
        CAMERA_HAL_RET ret = CAMERA_HAL_ERR_NONE;
        mCameraReady == true;
        mCaptureDevice->GetDevType(&mSensorType);

        if ((ret = AllocInterBuf())<0)			//分配内存
            return ret;
        if ((ret = InitCameraHalParam()) < 0)	//Camera参数初始化;如果需要这里可以改动;
            return ret;
        if ((ret = CameraMiscInit()) < 0)		//不太清楚;我们不管;
            return ret;

        return ret;
    }

     如果我们需要接收apk传递下来的参数比如设置白平衡、帧率扫描的就修改 setParameters(const CameraParameters& params);模仿添加相应的功能就可以了;

status_t  CameraHal:: setParameters(const CameraParameters& params)
    {
        CAMERA_LOG_FUNC;
        int w, h;
        int framerate;
        int max_zoom,zoom, max_fps, min_fps;
        char tmp[128];
        Mutex::Autolock lock(mLock);

        max_zoom = params.getInt(CameraParameters::KEY_MAX_ZOOM);
        zoom = params.getInt(CameraParameters::KEY_ZOOM);
        if(zoom > max_zoom){
            CAMERA_LOG_ERR("Invalid zoom setting, zoom %d, max zoom %d",zoom,max_zoom);
            return BAD_VALUE;
        }
        if (!((strcmp(params.getPreviewFormat(), "yuv420sp") == 0) ||
                (strcmp(params.getPreviewFormat(), "yuv420p") == 0)// || (strcmp(params.getPreviewFormat(), "yuv422i-yuyv") == 0)
                )) {
            CAMERA_LOG_ERR("Only yuv420sp or yuv420pis supported, but input format is %s", params.getPreviewFormat());
            return BAD_VALUE;
        }

        if (strcmp(params.getPictureFormat(), "jpeg") != 0) {
            CAMERA_LOG_ERR("Only jpeg still pictures are supported");
            return BAD_VALUE;
        }

        params.getPreviewSize(&w, &h);
        sprintf(tmp, "%dx%d", w, h);
        CAMERA_LOG_INFO("Set preview size: %s", tmp);
        if (strstr(mSupportedPreviewSizes, tmp) == NULL){
            CAMERA_LOG_ERR("The preview size w %d, h %d is not corrected", w, h);
            return BAD_VALUE;
        }

        params.getPictureSize(&w, &h);
        sprintf(tmp, "%dx%d", w, h);
        CAMERA_LOG_INFO("Set picture size: %s", tmp);
        if (strstr(mSupportedPictureSizes, tmp) == NULL){
            CAMERA_LOG_ERR("The picture size w %d, h %d is not corrected", w, h);
            return BAD_VALUE;
        }

        framerate = params.getPreviewFrameRate();
        CAMERA_LOG_INFO("Set frame rate:%d FPS", framerate);
        if ((framerate > 30) || (framerate < 0) ){
            CAMERA_LOG_ERR("The framerate is not corrected");
            return BAD_VALUE;
        }

        params.getPreviewFpsRange(&min_fps, &max_fps);
        CAMERA_LOG_INFO("FPS range: %d - %d",min_fps, max_fps);
        if (max_fps < 1000 || min_fps < 1000 || max_fps > 33000 || min_fps > 33000){
            CAMERA_LOG_ERR("The fps range from %d to %d is error", min_fps, max_fps);
            return BAD_VALUE;
        }

        const char *pFlashStr;
        pFlashStr = params.get(CameraParameters::KEY_FLASH_MODE);
        if (strcmp(pFlashStr, CameraParameters::FLASH_MODE_OFF) != 0 && strcmp(pFlashStr, CameraParameters::FLASH_MODE_AUTO) != 0
                && strcmp(pFlashStr, CameraParameters::FLASH_MODE_ON) != 0 && strcmp(pFlashStr, CameraParameters::FLASH_MODE_RED_EYE) != 0
                && strcmp(pFlashStr, CameraParameters::FLASH_MODE_TORCH) != 0) {
            CAMERA_LOG_ERR("The flash mode is not corrected");
            return BAD_VALUE;
        }

        const char *pFocusStr;
        pFocusStr = params.get(CameraParameters::KEY_FOCUS_MODE);
        if(strcmp(pFocusStr, CameraParameters::FOCUS_MODE_AUTO) != 0 && strcmp(pFocusStr, CameraParameters::FOCUS_MODE_INFINITY) != 0
                && strcmp(pFocusStr, CameraParameters::FOCUS_MODE_MACRO) != 0 && strcmp(pFocusStr, CameraParameters::FOCUS_MODE_FIXED) != 0
                && strcmp(pFocusStr, CameraParameters::FOCUS_MODE_EDOF) != 0 && strcmp(pFocusStr, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) != 0) {
            CAMERA_LOG_ERR("The focus mode is not corrected");
            return BAD_VALUE;
        }

		// auto white banlance
		const char *pWhiteBalanceStr;
		//mParameters.get()是获得上层的设置信息;不是从底层驱动获得的;
		pWhiteBalanceStr = mParameters.get(CameraParameters::KEY_WHITE_BALANCE);
        CAMERA_LOG_INFO("white balance: %s",pWhiteBalanceStr);
        if (strcmp(pWhiteBalanceStr, CameraParameters::WHITE_BALANCE_AUTO) == 0){
			//DevAWB()是自己添加的设置白平衡的功能;CaptureDeviceInterface.cpp添加虚函数;V4l2CapDeviceBase.cpp内实现;
			if(mCaptureDevice->DevAWB(mCameraid) == 0)
			{
				CAMERA_LOG_INFO("%s@%d********auto white balance successed*********\n",__func__,__LINE__);
			}else {
			
			CAMERA_LOG_INFO("%s@%d********auto white balance failed*********\n",__func__,__LINE__);
			return BAD_VALUE;

			}
        }else{
			if(mCaptureDevice->DevAWB(mCameraid) == 0)
			{
			
			CAMERA_LOG_INFO("%s@%d********auto white balance successed*********\n",__func__,__LINE__);
			}else {
					CAMERA_LOG_INFO("%s@%d********auto white balance failed*********\n",__func__,__LINE__);
					 return BAD_VALUE;
				}
        }
		
        mParameters = params;

        return NO_ERROR;
    }

          如果要添加自动对焦功能也是在这个文件里面添加;fsl的自动对焦、取消自动对焦都没实现;不过上层接口都是完整的;你只要填充这个文件;实现驱动就可以了;

下面是从CameraModul.cpp调用autoFocus流程;

CameraModul.cpp文件代码如下:

int camera_device_open(const hw_module_t* module, const char* name,
                hw_device_t** device)
{
       //自动对焦;
       camera_ops->auto_focus = camera_auto_focus;

}
int camera_auto_focus(struct camera_device * device)
{
    int rv = -EINVAL;
    fsl_camera_device_t* fsl_dev = NULL;

    LOGV("%s", __FUNCTION__);

    if(!device)
        return rv;

    fsl_dev = (fsl_camera_device_t*) device;
	//关键在这里;调用CameraHal.cpp层实现;
    rv = gCameraHals[fsl_dev->cameraid]->autoFocus();
    return rv;
}

CameraHal.cpp文件代码如下:

 status_t CameraHal::autoFocus()
    {
        CAMERA_LOG_FUNC;

        Mutex::Autolock lock(mLock);

        if (mAutoFocusThread != NULL)
            mAutoFocusThread.clear();
<span style="white-space:pre">	</span>//new 一自动对焦线程;
        mAutoFocusThread = new AutoFocusThread(this);
        if (mAutoFocusThread == NULL)
            return UNKNOWN_ERROR;
        return NO_ERROR;
    }


//创建一个线程;这个线程运行的函数是:mHardware->autoFocusThread()
        class AutoFocusThread : public Thread {
            CameraHal* mHardware;
        public:
            AutoFocusThread(CameraHal* hw)
                : Thread(false), mHardware(hw), mTID(0)  { }
            virtual void onFirstRef() {
                run("AutoFocusThread", PRIORITY_URGENT_DISPLAY);
            }
            virtual bool threadLoop() {
                mTID = gettid();
				//具体实现在autoFocusThread();
                if (mHardware->autoFocusThread()>=0)	//返回值大于0对焦成功;
                    return true;		
                else
                    return false;
            }
            int mTID;
        };

int CameraHal::autoFocusThread()
    {
        CAMERA_LOG_FUNC;
        int FocusFlag = 0;
		//DevAutoFocus()就是我们实现;
		//CaptureDeviceInterface.h,V4l2CapDeviceBase.h添加定义;
		//V4l2CapDeviceBase.cpp添加具体实现;
		//mCameraid参数随便传;你驱动判断做相应动作;实际就是传递给ctrl.value的值;
		if(mCaptureDevice->DevAutoFocus(mCameraid) == 0)
			{
				CAMERA_LOG_INFO("%s@%d********auto focus successed*********\n",__func__,__LINE__);
			}else {
			
			CAMERA_LOG_INFO("%s@%d********auto focus failed*********\n",__func__,__LINE__);
			}
		//系统原生的;回调函数告诉Camera服务自动对焦成功了;实际没自动对焦;
        if (mMsgEnabled & CAMERA_MSG_FOCUS)
            mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie);


        return UNKNOWN_ERROR; //exit the thread
    }

       取消自动对焦;fsl也没有实现;
status_t CameraHal::cancelAutoFocus()
	   {
		   CAMERA_LOG_FUNC;
		   //空的;fsl原生没有实现;
		   return NO_ERROR;
	   }


 status_t CameraHal::cancelAutoFocus()
    {
        CAMERA_LOG_FUNC;
		//我驱动用3来判断释放自动对焦;
		int focusModule = 3;
		//取消自动对焦和自动对焦调用同一个函数DevAutoFocus;
		if(mCaptureDevice->DevAutoFocus(focusModule) == 0)
			{
				CAMERA_LOG_INFO("%s@%d**************succeeded\n",__func__,__LINE__);
			}else {
			
			CAMERA_LOG_INFO("%s@%d*****************failed\n",__func__,__LINE__);
			
				return UNKNOWN_ERROR;
			}
		
		return NO_ERROR;
    }












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Ubuntu 22.04上安装FSL,你可以按照以下步骤进行操作: 1. 打开终端,并使用管理员权限运行以下命令来更新系统软件包列表: ``` sudo apt update ``` 2. 确保你已经安装了必要的软件依赖项。运行以下命令来安装这些依赖项: ``` sudo apt install build-essential curl libxp6 libxt6 libxtst6 libgomp1 libglu1-mesa libxmu6 ``` 3. 下载FSL安装程序。你可以从FSL官方网站下载最新版本的fslinstaller.py文件。进入到你想要保存的目录,并使用以下命令下载: ``` curl -O https://fsl.fmrib.ox.ac.uk/fsldownloads/fslinstaller.py ``` 4. 运行安装程序。在终端中进入保存了fslinstaller.py文件的目录,并使用以下命令运行安装程序: ``` sudo python fslinstaller.py ``` 5. 安装过程需要一些时间,请耐心等待。一旦安装完成,你将在终端中看到相应的提示。 6. 设置环境变量。为了在任何位置都能够使用FSL工具,你需要将FSL的安装目录添加到系统的环境变量中。打开终端,并编辑你的bash配置文件(例如~/.bashrc): ``` nano ~/.bashrc ``` 在文件的末尾添加以下行,其中`<FSL安装目录>`是你的FSL安装路径: ``` export FSLDIR=<FSL安装目录> source $FSLDIR/etc/fslconf/fsl.sh ``` 保存文件并退出编辑器。然后,重新加载bash配置文件以使更改生效: ``` source ~/.bashrc ``` 7. 验证安装。通过在终端中运行以下命令来验证FSL是否成功安装: ``` fslinfo ``` 如果安装成功,你将看到FSL的版本和其他相关信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值