源码平台:rk3399
该文件在hardware/rockchip/camera/CameraHal/CameraHal_Module.cpp 中的camera_get_number_of_cameras函数获取摄像头数量的时候会解析,camera_board_profiles::getInstance();
770
771 memset(&camInfoTmp[0],0x00,sizeof(rk_cam_info_t));
772 memset(&camInfoTmp[1],0x00,sizeof(rk_cam_info_t));
773
774 profiles = camera_board_profiles::getInstance();
775 nCamDev = profiles->mDevieVector.size();
776 LOGE("board profiles cam num %d\n", nCamDev);
777 //if uvc got 2 , ignore csi
camera_board_profiles::getInstance()在hardware/rockchip/camera/CameraHal/CameraHal_board_xml_parse.cpp
1061 }
1062
1063 camera_board_profiles* camera_board_profiles::getInstance()
1064 {
1065 camera_board_profiles *profiles = createInstance();
1066
1067 return profiles;
1068 }
1069
接着看createInstance()
1003 camera_board_profiles* camera_board_profiles::createInstance()
1004 {
1005 FILE *fp = NULL;
1006
1007 camera_board_profiles *profiles = new camera_board_profiles();
1008
1009 fp = fopen(RK_BOARD_XML_PATH, "r");
1010 if(!fp){
1011 LOGD("This machine have not dvp/mipi camera!!\n");
1012 return profiles;
1013 }
1014
1015 LOGD("open xml file(%s) success\n", RK_BOARD_XML_PATH);
1016
1017 XML_Parser parser = XML_ParserCreate(NULL);
1018 if(parser==NULL){
1019 ALOGE("XML_ParserCreate failed\n");
1020 return NULL;
1021 }
1022
1023 XML_SetUserData(parser, profiles);
1024 XML_SetElementHandler(parser, StartElementHandler, NULL);
1025
1026 const int BUFF_SIZE = 512;
1027 for (;;) {
1028 void *buff = ::XML_GetBuffer(parser, BUFF_SIZE);
1029 if (buff == NULL) {
1030 ALOGE("failed to in call to XML_GetBuffer()");
1031 goto exit;
1032 }
1033
1034 int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp);
1035 if (bytes_read < 0) {
1036 ALOGE("failed in call to read");
1037 goto exit;
1038 }
1039
1040 int res = XML_ParseBuffer(parser, bytes_read, bytes_read == 0);
1041 if(res!=1){
1042 ALOGE("XML_ParseBuffer error or susppend (%d)\n", res);
1043 }
1044
1045 if (bytes_read == 0) break; // done parsing the xml file
1046 }
1047
1048 exit:
1049 XML_ParserFree(parser);
1050 fclose(fp);
1051
1052 size_t nCamDev2 = profiles->mDevieVector.size();
1053 ALOGD("number of camdevice (%d)\n", nCamDev2);
1054
1055 if (nCamDev2>0) {
1056 size_t nDVnum2 = profiles->mCurDevice->mSoftInfo.mDV_vector.size();
1057 ALOGD("now DV size(%d)\n", nDVnum2);
1058 }
1059 return profiles;
1060
1061 }
camera_board_profiles结构体定义在./CameraHal_board_xml_parse.h,这个头文件不仅定义了cam_board.xml文件各个标签项的解析函数,还有注册,loadsensor等等很多函数.
fp = fopen(RK_BOARD_XML_PATH, "r");函数打开这个cam_board.xml文件,然后设置parser,XML_SetUserData,XML_SetElementHandler,其中XML_SetElementHandler设置的StartElementHandler就是具体解析每一个标签的执行者.
然后就开始来for的死循环,从文件中读取元素到XML_GetBuffer里面,然后ElementHandler去处理,
进入StartElementHandler函数看看具体它是怎么解析,我们按程序执行顺序看这个函数
883 camera_board_profiles *pCamInfoProfiles = (camera_board_profiles *) userData;
884 rk_cam_total_info *pCamInfo = pCamInfoProfiles->mCurDevice;
885 int support = 0;
pCamInfoProfiles用来保存解析后的结果,返回给调用者.
然后就开始解析来,先判断是不是BoardXmlVersion标签,这里获取版本信息
887 if(strcmp(name,"BoardXmlVersion")==0){
888 int highBit = 0;
889 int middleBit = 0;
890 int lowBit = 0;
891 sscanf(atts[1], "v%x.%x.%x", &highBit, &middleBit, &lowBit);
892 pCamInfoProfiles->mBoardXmlVersion = ( (highBit&0xff)<<16 ) + ( (middleBit&0xff)<<8 ) + (lowBit&0xff) ;
893 ALOGD("\n\n\n Cam_board.xml Version Check: \n");
894 ALOGD(" /etc/cam_board.xml : %s\n",atts[1]);
895 ALOGD(" CameraHal_board_xml_parser: v%d.%d.%d\n",
896 (ConfigBoardXmlVersion&0xff0000)>>16,
897 (ConfigBoardXmlVersion&0xff00)>>8,
898 ConfigBoardXmlVersion&0xff);
899 }
然后
912 if(strcmp(name,"CamDevie")==0){
913 rk_cam_total_info* pNewCamInfo = new rk_cam_total_info();
914 if(pNewCamInfo){
915 pCamInfoProfiles->mCurDevice= pNewCamInfo;
916 pCamInfoProfiles->mDevieVector.add(pNewCamInfo);
917 pNewCamInfo->mDeviceIndex = (pCamInfoProfiles->mDevieVector.size()) - 1;
918 memset(pNewCamInfo->mHardInfo.mSensorInfo.mLensName,0,CAMSYS_NAME_LEN);
919 memset(pNewCamInfo->mHardInfo.mSensorInfo.mSensorGpioPwdn.name,0,CAMSYS_NAME_LEN);
920 memset(pNewCamInfo->mHardInfo.mSensorInfo.mSensorGpioPwdn0.name,0,CAMSYS_NAME_LEN);
921 memset(pNewCamInfo->mHardInfo.mSensorInfo.mSensorGpioPwdn1.name,0,CAMSYS_NAME_LEN);
922 }else{
923 ALOGE("%s(%d): Warnimg camdevice malloc fail! \n", __FUNCTION__,__LINE__);
924 }
925 }else if (strstr(name, "Sensor")) {
926 ParserSensorInfo(name, atts, userData);
927 } else if (strstr(name, "VCM")) {
928 ParserVCMInfo(name, atts, userData);
929 } else if (strstr(name,"Flash")){
930 ParserFlashInfo(name, atts, userData);
931 } else if (strstr(name,"AWB")){
932 ParserAwbConfig(name, atts, userData);
933 } else if (strstr(name,"Sence")){
934 ParserSenceConfig(name, atts, userData);
935 } else if (strstr(name,"Effect")){
936 ParserEffectConfig(name, atts, userData);
937 } else if (strstr(name,"Focus")){
938 ParserFocusConfig(name, atts, userData);
939 } else if (strstr(name,"Anti_Banding")){
940 ParserAntiBandingConfig(name, atts, userData);
941 } else if (strstr(name,"HDR")){
942 support = atoi(atts[1]);
943 pCamInfo->mSoftInfo.mHDRConfig = support;
944 ALOGD("%s(%d): HDR(%d)! \n", __FUNCTION__,__LINE__,support);
945 } else if (strstr(name,"ZSL")){
946 support = atoi(atts[1]);
947 pCamInfo->mSoftInfo.mZSLConfig= support;
948 ALOGD("%s(%d): ZSL(%d)! \n", __FUNCTION__,__LINE__,support);
949 } else if (strstr(name,"DigitalZoom")){
950 support = atoi(atts[1]);
951 pCamInfo->mSoftInfo.mZoomConfig= support;
952 ALOGD("%s(%d): zoom(%d)! \n", __FUNCTION__,__LINE__,support);
953 } else if (strstr(name,"PreCproc")){
954 pCamInfo->mSoftInfo.mPreCprocConfig.mSupported = (atoi(atts[1]) == 1) ? true:false;
955 pCamInfo->mSoftInfo.mPreCprocConfig.mContrast = atof(atts[3]);
956 pCamInfo->mSoftInfo.mPreCprocConfig.mSaturation = atof(atts[5]);
957 pCamInfo->mSoftInfo.mPreCprocConfig.mHue= atof(atts[7]);
958 pCamInfo->mSoftInfo.mPreCprocConfig.mBrightness = atoi(atts[9]);
959 ALOGD("%s(%d): PreCproc support %d(contrast:%f,saturation:%f,hue:%f,brightness:%d)! \n",
960 __FUNCTION__,__LINE__,atoi(atts[1]),atof(atts[3]),atof(atts[5]),atof(atts[7]),atoi(atts[9]));
961 } else if (strstr(name,"CapCproc")){
962 pCamInfo->mSoftInfo.mCapCprocConfig.mSupported = (atoi(atts[1]) == 1) ? true:false;
963 pCamInfo->mSoftInfo.mCapCprocConfig.mContrast = atof(atts[3]);
964 pCamInfo->mSoftInfo.mCapCprocConfig.mSaturation = atof(atts[5]);
965 pCamInfo->mSoftInfo.mCapCprocConfig.mHue= atof(atts[7]);
966 pCamInfo->mSoftInfo.mCapCprocConfig.mBrightness = atoi(atts[9]);
967 ALOGD("%s(%d): CapCproc support %d(contrast:%f,saturation:%f,hue:%f,brightness:%d)! \n",
968 __FUNCTION__,__LINE__,atoi(atts[1]),atof(atts[3]),atof(atts[5]),atof(atts[7]),atoi(atts[9]));
969 } else if (strstr(name,"Gammaout")){
970 pCamInfo->mSoftInfo.mGammaOutConfig.mSupported = (atoi(atts[1]) == 1) ? true:false;
971 pCamInfo->mSoftInfo.mGammaOutConfig.mGamma= atof(atts[3]);
972 pCamInfo->mSoftInfo.mGammaOutConfig.mOffSet= atoi(atts[5]);
973 ALOGD("%s(%d): Gammaout support %d(mGamma:%f,mOffSet:%d)! \n", __FUNCTION__,__LINE__,atoi(atts[1]),atof(atts[3]),atoi(atts[5]));
974 } else if (strstr(name,"FaceDetect")){
975 support = atoi(atts[1]);
976 pCamInfo->mSoftInfo.mFaceDetctConfig.mFaceDetectSupport = support;
977 pCamInfo->mSoftInfo.mFaceDetctConfig.mFaceMaxNum = atoi(atts[3]);
978 ALOGD("%s(%d): face detect config(%d),max face num is (%d)! \n", __FUNCTION__,__LINE__,support,atoi(atts[3]));
979 } else if (strstr(name,"PreviewSize")){
980 pCamInfo->mSoftInfo.mPreviewWidth = atoi(atts[1]);
981 pCamInfo->mSoftInfo.mPreviewHeight = atoi(atts[3]);
这个函数就很长来,具体就是解析每一个元素,比如对比字符串含Sensor的标签,就调用ParserSensorInfo解析这一类的标签,如果是Flash的标签,就调用ParserFlashInfo解析这一类标签.
看看ParseSensorInfo函数
162 void camera_board_profiles::ParserSensorInfo(const char *name, const char **atts, void *userData)
163 {
164 camera_board_profiles *pCamInfoProfiles = (camera_board_profiles *) userData;
165 rk_cam_total_info *pCamInfo = pCamInfoProfiles->mCurDevice;
166 rk_sensor_info *pSensorInfo = &(pCamInfo->mHardInfo.mSensorInfo);
167 int result;
168 if (strcmp(name, "SensorName")==0) {
169 strlcpy(pSensorInfo->mSensorName, atts[1], sizeof(pSensorInfo->mSensorName));
170 ALOGD("%s(%d): SensorName(%s)\n", __FUNCTION__, __LINE__, pSensorInfo->mSensorName);
171 }else if (strcmp(name, "ModuleName")==0) {
172 strlcpy(pSensorInfo->mModuleName, atts[1], sizeof(pSensorInfo->mModuleName));
173 ALOGD("%s(%d): ModuleName(%s)\n", __FUNCTION__, __LINE__, pSensorInfo->mModuleName);
174 }else if (strcmp(name, "SensorLens")==0) {
175 strlcpy(pSensorInfo->mLensName, atts[1], sizeof(pSensorInfo->mLensName));
176 ALOGD("%s(%d): lensName(%s)\n", __FUNCTION__, __LINE__, pSensorInfo->mLensName);
177 } else if (strcmp(name, "SensorDevID")==0) {
178 ALOGD("%s(%d): SensorDevID(%s)\n", __FUNCTION__, __LINE__, atts[1]);
179 if(strcmp("CAMSYS_DEVID_SENSOR_1A", atts[1])==0){
180 pSensorInfo->mCamDevid = CAMSYS_DEVID_SENSOR_1A;
181 }else if(strcmp("CAMSYS_DEVID_SENSOR_1B", atts[1])==0){
182 pSensorInfo->mCamDevid = CAMSYS_DEVID_SENSOR_1B;
183 }else if(strcmp("CAMSYS_DEVID_SENSOR_2", atts[1])==0){
184 pSensorInfo->mCamDevid = CAMSYS_DEVID_SENSOR_2;
185 }else{
186 pSensorInfo->mCamDevid = 0;
187 ALOGD("%s(%d): SensorDevID(%s) don't support\n", __FUNCTION__, __LINE__, atts[1]);
188 }
189 ALOGD("%s(%d): SensorDevID(%d)\n", __FUNCTION__, __LINE__, pSensorInfo->mCamDevid);
190 } else if (strcmp(name,"SensorHostDevID")==0){
191 ALOGD("%s(%d): SensorHostDevID(%s)\n", __FUNCTION__, __LINE__, atts[1]);
192 if(strcmp("CAMSYS_DEVID_MARVIN", atts[1])==0){
193 pSensorInfo->mHostDevid= CAMSYS_DEVID_MARVIN;
194 strlcpy(pSensorInfo->mCamsysDevPath, "/dev/camsys_marvin", sizeof(pSensorInfo->mCamsysDevPath));
195 }else if(strcmp("CAMSYS_DEVID_CIF_0", atts[1])==0){
196 pSensorInfo->mHostDevid = CAMSYS_DEVID_CIF_0;
197 strlcpy(pSensorInfo->mCamsysDevPath, "/dev/camsys_cif0", sizeof(pSensorInfo->mCamsysDevPath));
198 }else if(strcmp("CAMSYS_DEVID_CIF_1", atts[1])==0){
199 pSensorInfo->mHostDevid = CAMSYS_DEVID_CIF_1;
200 strlcpy(pSensorInfo->mCamsysDevPath, "/dev/camsys_cif1", sizeof(pSensorInfo->mCamsysDevPath));
具体的解析方法就是对比每一个元素的名称,然后将对于的元素的值保存到pSensorInfo里面.