假设系统中的MIPI CSI通道为0,获取该通道控制器操作句柄的示例如下:
DevHandle MipiCsiHandle = NULL;
id = 0;
MipiCsiHandle = MipiCsiOpen(id);
if (MipiCsiHandle == NULL) {
HDF_LOGE("MipiCsiOpen: mipi csi open fail.\n");
return NULL;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
进行MIPI CSI相应配置
int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 5 MipiCsiSetComboDevAttr的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
pAttr | 结构体指针,MIPI CSI相应配置 |
返回值 | 返回值描述 |
HDF_SUCCESS | 设置成功 |
负数 | 设置失败 |
int32_t ret;
struct ComboDevAttr attr;
(void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr));
attr.devno = 0;
attr.inputMode = INPUT_MODE_MIPI;
attr.dataRate = MIPI_DATA_RATE_X1;
attr.imgRect.x = 0;
attr.imgRect.y = 0;
attr.imgRect.width = 2592;
attr.imgRect.height = 1944;
ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiSetComboDevAttr: mipi csi set combo dev attr fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 6 MipiCsiSetExtDataType的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
dataType | 结构体指针,定义YUV和原始数据格式以及位深度 |
返回值 | 返回值描述 |
HDF_SUCCESS | 设置成功 |
负数 | 设置失败 |
int32_t ret;
struct ExtDataType dataType;
dataType.devno = 0;
dataType.num = 0;
dataType.extDataBitWidth[0] = 12;
dataType.extDataBitWidth[1] = 12;
dataType.extDataBitWidth[2] = 12;
dataType.extDataType[0] = 0x39;
dataType.extDataType[1] = 0x39;
dataType.extDataType[2] = 0x39;
ret = MipiCsiSetExtDataType(MipiCsiHandle, &dataType);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiSetExtDataType: mipi csi set ext data type fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 7 MipiCsiSetHsMode的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
laneDivideMode | 结构体类型,Lane模式参数 |
返回值 | 返回值描述 |
HDF_SUCCESS | 设置成功 |
负数 | 设置失败 |
int32_t ret;
enum LaneDivideMode mode;
mode = LANE_DIVIDE_MODE_0;
ret = MipiCsiSetHsMode(MipiCsiHandle, mode);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiSetHsMode: mipi csi set hs mode fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 8 MipiCsiSetPhyCmvmode的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
cmvMode | 结构体类型,共模电压模式参数 |
devno | uint8_t类型,设备编号 |
返回值 | 返回值描述 |
HDF_SUCCESS | 设置成功 |
负数 | 设置失败 |
int32_t ret;
enum PhyCmvMode mode;
uint8_t devno;
mode = PHY_CMV_GE1200MV;
devno = 0;
ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, mode);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiSetPhyCmvmode: mipi csi set phy cmv mode fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
复位/撤销复位Sensor
int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 9 MipiCsiResetSensor的参数和返回值描述
- 表 9 MipiCsiResetSensor的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
snsResetSource | uint8_t类型,传感器的复位信号线号,在软件中称为传感器的复位源 |
返回值 | 返回值描述 |
HDF_SUCCESS | 复位成功 |
负数 | 复位失败 |
int32_t ret;
uint8_t snsResetSource;
snsResetSource = 0;
ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiResetSensor: mipi csi reset sensor fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 10 MipiCsiUnresetSensor的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
snsResetSource | uint8_t类型,传感器的复位信号线号,在软件中称为传感器的复位源 |
返回值 | 返回值描述 |
HDF_SUCCESS | 撤销复位成功 |
负数 | 撤销复位失败 |
int32_t ret;
uint8_t snsResetSource;
snsResetSource = 0;
ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiUnresetSensor: mipi csi unreset sensor fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
复位/撤销复位MIPI RX
int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 11 MipiCsiResetRx的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
comboDev | uint8_t类型,MIPI RX或LVDS通路序号 |
返回值 | 返回值描述 |
HDF_SUCCESS | 复位成功 |
负数 | 复位失败 |
int32_t ret;
uint8_t comboDev;
comboDev = 0;
ret = MipiCsiResetRx(MipiCsiHandle, comboDev);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiResetRx: mipi csi reset rx fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 12 MipiCsiUnresetRx的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
comboDev | uint8_t类型,MIPI RX或LVDS通路序号 |
返回值 | 返回值描述 |
HDF_SUCCESS | 撤销复位成功 |
负数 | 撤销复位失败 |
int32_t ret;
uint8_t comboDev;
comboDev = 0;
ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiUnresetRx: mipi csi unreset rx fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
使能/关闭MIPI的时钟
int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 13 MipiCsiEnableClock的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
comboDev | uint8_t类型,通路序号 |
返回值 | 返回值描述 |
HDF_SUCCESS | 使能成功 |
负数 | 使能失败 |
int32_t ret;
uint8_t comboDev;
comboDev = 0;
ret = MipiCsiEnableClock(MipiCsiHandle, comboDev);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiEnableClock: mipi csi enable clock fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 14 MipiCsiDisableClock的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
comboDev | uint8_t类型,通路序号 |
返回值 | 返回值描述 |
HDF_SUCCESS | 关闭成功 |
负数 | 关闭失败 |
int32_t ret;
uint8_t comboDev;
comboDev = 0;
ret = MipiCsiDisableClock(MipiCsiHandle, comboDev);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiDisableClock: mipi csi disable clock fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
使能/关闭MIPI上的Sensor时钟
int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 15 MipiCsiEnableSensorClock的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
snsClkSource | uint8_t类型,传感器的时钟信号线号,在软件中称为传感器的时钟源 |
返回值 | 返回值描述 |
HDF_SUCCESS | 使能成功 |
负数 | 使能失败 |
int32_t ret;
uint8_t snsClkSource;
snsClkSource = 0;
ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiEnableSensorClock: mipi csi enable sensor clock fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
表 16 MipiCsiDisableSensorClock的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,控制器操作句柄 |
snsClkSource | uint8_t类型,传感器的时钟信号线号,在软件中称为传感器的时钟源 |
返回值 | 返回值描述 |
HDF_SUCCESS | 关闭成功 |
负数 | 关闭失败 |
int32_t ret;
uint8_t snsClkSource;
snsClkSource = 0;
ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource);
if (ret != HDF_SUCCESS) {
HDF_LOGE("MipiCsiDisableSensorClock: mipi csi disable sensor clock fail, ret=%d\n", ret);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
释放MIPI CSI控制器操作句柄
MIPI CSI使用完成之后,需要释放控制器操作句柄,释放句柄的函数如下所示:
void MipiCsiClose(DevHandle handle);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
该函数会释放掉由MipiCsiOpen申请的资源。
表 17 MipiCsiClose的参数和返回值描述
class="table-box">参数 | 参数描述 |
---|
handle | DevHandle类型,MIPI CSI控制器操作句柄 |
MipiCsiClose(MIPIHandle);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
使用实例
本例拟对Hi3516DV300开发板上MIPI CSI设备进行操作。
MIPI CSI完整的使用示例如下所示:
#include "hdf_log.h"
#include "mipi_csi_if.h"
#include "securec.h"
enum InterfaceType {
INTERFACE_MIPI = 0,
INTERFACE_LVDS,
INTERFACE_CMOS,
INTERFACE_BUTT
};
static void InitMipiDevAttr(MipiDevAttr *mipiAttr)
{
MipiDevAttr attr;
if (mipiAttr == NULL) {
return;
}
HDF_LOGI("InitMipiDevAttr: enter.");
(void)memset_s(&attr, sizeof(MipiDevAttr), 0, sizeof(MipiDevAttr));
attr.inputDataType = DATA_TYPE_RAW_12BIT;
attr.wdrMode = HI_MIPI_WDR_MODE_NONE;
attr.laneId[0] = 0;
attr.laneId[1] = 1;
attr.laneId[2] = 2;
attr.laneId[3] = 3;
if (attr.wdrMode == HI_MIPI_WDR_MODE_DT) {
attr.dataType[0] = 0x39;
attr.dataType[1] = 0x39;
attr.dataType[2] = 0x39;
attr.dataType[3] = 0x39;
}
*mipiAttr = attr;
}
static int MipiGetIntputModeType(InputMode inputMode)
{
switch (inputMode) {
case INPUT_MODE_SUBLVDS:
case INPUT_MODE_LVDS:
case INPUT_MODE_HISPI:
return INTERFACE_LVDS;
case INPUT_MODE_MIPI:
return INTERFACE_MIPI;
case INPUT_MODE_CMOS:
case INPUT_MODE_BT1120:
case INPUT_MODE_BT656:
case INPUT_MODE_BYPASS:
return INTERFACE_CMOS;
default:
break;
}
return INTERFACE_BUTT;
}
static void InitLvdsDevAttr(LvdsDevAttr *lvdsAttr)
{
int i;
int j;
int k;
LvdsDevAttr attr;
if (lvdsAttr == NULL) {
return;
}
(void)memset_s(&attr, sizeof(LvdsDevAttr), 0, sizeof(LvdsDevAttr));
attr.inputDataType = DATA_TYPE_RAW_12BIT;
attr.wdrMode = HI_WDR_MODE_NONE;
attr.syncMode = LVDS_SYNC_MODE_SOF;
attr.vsyncAttr.syncType = LVDS_VSYNC_NORMAL;
if (attr.vsyncAttr.syncType == LVDS_VSYNC_HCONNECT) {
attr.vsyncAttr.hblank1 = 0;
attr.vsyncAttr.hblank2 = 0;
}
attr.fidAttr.fidType = LVDS_FID_NONE;
attr.fidAttr.outputFil = 'm';
attr.dataEndian = LVDS_ENDIAN_LITTLE;
attr.syncCodeEndian = LVDS_ENDIAN_LITTLE;
attr.laneId[0] = 0;
attr.laneId[1] = 1;
attr.laneId[2] = 2;
attr.laneId[3] = 3;
for (i = 0; i < LVDS_LANE_NUM; i++) {
for (j = 0; j < WDR_VC_NUM; j++) {
for (k = 0; k < SYNC_CODE_NUM; k++) {
attr.syncCode[i][j][k] = 0;
}
}
}
*lvdsAttr = attr;
}
static int32_t PalMipiCsiTestSample(void)
{
uint8_t id;
int32_t ret;
uint8_t comboDev;
uint8_t snsClkSource;
uint8_t snsResetSource;
uint8_t devno;
LaneDivideMode laneMode;
PhyCmvMode CmvMode;
ComboDevAttr attr;
DevHandle MipiCsiHandle = NULL;
enum InterfaceType interType;
id = 0;
MipiCsiHandle = MipiCsiOpen(id);
if (MipiCsiHandle == NULL) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi open fail!\n");
return HDF_FAILURE;
}
laneMode = LANE_DIVIDE_MODE_0;
ret = MipiCsiSetHsMode(MipiCsiHandle, laneMode);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi set hs mode fail, ret=%d\n", ret);
return ret;
}
comboDev = 0;
ret = MipiCsiEnableClock(MipiCsiHandle, comboDev);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi enable clock fail, ret=%d\n", ret);
return ret;
}
ret = MipiCsiResetRx(MipiCsiHandle, comboDev);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi reset rx fail, ret=%d\n", ret);
return ret;
}
snsClkSource = 0;
ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi enable sensor clock fail, ret=%d\n", ret);
return ret;
}
snsResetSource = 0;
ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi reset sensor fail, ret=%d\n", ret);
return ret;
}
(void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr));
attr.devno = 0;
attr.inputMode = INPUT_MODE_MIPI;
attr.dataRate = MIPI_DATA_RATE_X1;
attr.imgRect.x = 0;
attr.imgRect.y = 0;
attr.imgRect.width = 2592;
attr.imgRect.height = 1944;
interType = MipiGetIntputModeType(attr.inputMode);
if (interType == INTERFACE_MIPI) {
HDF_LOGI("PalMipiCsiTestSample: call[InitMipiDevAttr].");
InitMipiDevAttr(&attr.mipiAttr);
} else if (interType == INTERFACE_LVDS) {
HDF_LOGI("PalMipiCsiTestSample: call[InitLvdsDevAttr].");
InitLvdsDevAttr(&attr.lvdsAttr);
} else {
HDF_LOGE("PalMipiCsiTestSample: interType = %d is error!", attr.inputMode);
}
ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi set combo devAttr fail, ret=%d\n", ret);
return ret;
}
CmvMode = PHY_CMV_GE1200MV;
devno = 0;
ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, CmvMode);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi set phy cmv mode fail, ret=%d\n", ret);
return ret;
}
comboDev = 0;
ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi unreset rx fail, ret=%d\n", ret);
return ret;
}
ret = MipiCsiDisableClock(MipiCsiHandle, comboDev);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi disable clock fail, ret=%d\n", ret);
return ret;
}
snsResetSource = 0;
ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi unreset sensor fail, ret=%d\n", ret);
return ret;
}
ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource);
if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {
HDF_LOGE("PalMipiCsiTestSample: mipi csi disable sensor clock fail, ret=%d\n", ret);
return ret;
}
HDF_LOGI("PalMipiCsiTestSample: function tests end.");
MipiCsiClose(MipiCsiHandle);
return ret;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
如果大家想更加深入的学习 OpenHarmony(鸿蒙南向) 开发的全栈内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……

- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……



写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:
https://qr21.cn/FV7h05

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/maniuT/article/details/141111728","extend1":"pc","ab":"new"}">>
id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension">
class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}">
class="blog_extension_card_left">
class="blog_extension_card_cont">
鸿蒙开发学习资料领取!!!
class="blog_extension_card_cont_r">
微信名片
评论记录:
回复评论: