当前位置: 首页 > news >正文

百度站长工具怎么推广网站微信小程序开发视频完整教程

百度站长工具怎么推广网站,微信小程序开发视频完整教程,绿色网站风格,企业信用查询官网SDIO#xff08;Secure Digital Input and Output#xff09;由SD卡发展而来#xff0c;与SD卡统称为MMC#xff08;MultiMediaCard#xff09;#xff0c;二者使用相同的通信协议。SDIO接口兼容以前的SD卡#xff0c;并且可以连接支持SDIO接口的其他设备。 运作机制 …SDIOSecure Digital Input and Output由SD卡发展而来与SD卡统称为MMCMultiMediaCard二者使用相同的通信协议。SDIO接口兼容以前的SD卡并且可以连接支持SDIO接口的其他设备。 运作机制 在HDF框架中SDIO的接口适配模式采用独立服务模式如图1。在这种模式下每一个设备对象会独立发布一个设备服务来处理外部访问设备管理器收到API的访问请求之后通过提取该请求的参数达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力但需要为每个设备单独配置设备节点若设备过多可能增加内存占用。 独立服务模式下核心层不会统一发布一个服务供上层使用因此这种模式下驱动要为每个控制器发布一个服务具体表现为 驱动适配者需要实现HdfDriverEntry的Bind钩子函数以绑定服务。 device_info.hcs文件中deviceNode的policy字段为1或2不能为0。 SDIO模块各分层作用 接口层提供打开SDIO设备、设置块的大小、读取数据、写数据、设置公共信息、获取公共信息、刷新数据、独占HOST、释放Host、使能SDIO功能设备、去使能SDIO功能设备、申请中断、释放中断关闭SDIO设备的接口。 核心层主要提供SDIO控制器的添加、移除及管理的能力通过钩子函数与适配层交互。 适配层主要是将钩子函数的功能实例化实现具体的功能。 图 1 SDIO独立服务模式结构图 约束与限制 SDIO模块API当前仅支持内核态调用。 开发指导 场景介绍 SDIO的应用比较广泛目前有许多手机都支持SDIO功能并且很多SDIO外设也被开发出来使得手机外接外设更加容易。常见的SDIO外设有WLAN、GPS、CAMERA、蓝牙等。当驱动开发者需要将SDIO设备适配到OpenHarmony时需要进行SDIO驱动适配下文将介绍如何进行SDIO驱动适配。 接口说明 为了保证上层在调用SDIO接口时能够正确的操作硬件核心层在//drivers/hdf_core/framework/model/storage/include/mmc/mmc_sdio.h中定义了以下钩子函数。驱动适配者需要在适配层实现这些函数的具体功能并与这些钩子函数挂接从而完成接口层与核心层的交互。 SdioDeviceOps定义 struct SdioDeviceOps {int32_t (*incrAddrReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size);int32_t (*incrAddrWriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size);int32_t (*fixedAddrReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen);int32_t (*fixedAddrWriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen);int32_t (*func0ReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size);int32_t (*func0WriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size);int32_t (*setBlockSize)(struct SdioDevice *dev, uint32_t blockSize);int32_t (*getCommonInfo)(struct SdioDevice *dev, SdioCommonInfo *info, uint32_t infoType);int32_t (*setCommonInfo)(struct SdioDevice *dev, SdioCommonInfo *info, uint32_t infoType);int32_t (*flushData)(struct SdioDevice *dev);int32_t (*enableFunc)(struct SdioDevice *dev);int32_t (*disableFunc)(struct SdioDevice *dev);int32_t (*claimIrq)(struct SdioDevice *dev, SdioIrqHandler *irqHandler);int32_t (*releaseIrq)(struct SdioDevice *dev);int32_t (*findFunc)(struct SdioDevice *dev, struct SdioFunctionConfig *configData);int32_t (*claimHost)(struct SdioDevice *dev);int32_t (*releaseHost)(struct SdioDevice *dev); }; 表 1 SdioDeviceOps结构体成员的钩子函数功能说明 函数入参出参返回值功能incrAddrReadBytesdev结构体指针SDIO设备控制器 addruint32_t类型地址值 sizeuint32_t类型大小datauint8_t类型指针传出值HDF_STATUS相关状态从指定的SDIO地址增量读取给定长度的数据incrAddrWriteBytesdev结构体指针SDIO设备控制器 datauint8_t类型指针传入值 addruint32_t类型地址值 sizeuint32_t类型大小无HDF_STATUS相关状态将给定长度的数据增量写入指定的SDIO地址fixedAddrReadBytesdev结构体指针SDIO设备控制器 addruint32_t类型地址值 sizeuint32_t类型大小 scatterLenuint32_t类型数据长度datauint8_t类型指针传出值HDF_STATUS相关状态从固定SDIO地址读取给定长度的数据。fixedAddrWriteBytesdev结构体指针SDIO设备控制器 datauint8_t类型指针传入值 addruint32_t类型地址值 sizeuint32_t类型大小 scatterLenuint32_t类型数据长度无HDF_STATUS相关状态将给定长度的数据写入固定SDIO地址func0ReadBytesdev结构体指针SDIO设备控制器 addruint32_t类型地址值 sizeuint32_t类型大小datauint8_t类型指针传出值HDF_STATUS相关状态从SDIO函数0的地址空间读取给定长度的数据。func0WriteBytesdev结构体指针SDIO设备控制器 datauint8_t类型指针传入值 addruint32_t类型地址值 sizeuint32_t类型大小无HDF_STATUS相关状态将给定长度的数据写入SDIO函数0的地址空间。setBlockSizedev结构体指针SDIO设备控制器 blockSizeuint32_t类型Block大小无HDF_STATUS相关状态设置block大小getCommonInfodev联合体指针SDIO设备控制器 infoTypeuint32_t类型info类型info结构体指针传出SdioFuncInfo信息HDF_STATUS相关状态获取CommonInfo说明见下setCommonInfodev结构体指针SDIO设备控制器 info联合体指针SdioFuncInfo信息传入 infoTypeuint32_t类型info类型无HDF_STATUS相关状态设置CommonInfo说明见下flushDatadev结构体指针SDIO设备控制器无HDF_STATUS相关状态当SDIO需要重新初始化或发生意外错误时调用的函数enableFuncdev结构体指针SDIO设备控制器无HDF_STATUS相关状态使能SDIO设备disableFuncdev结构体指针SDIO设备控制器无HDF_STATUS相关状态去使能SDIO设备claimIrqdev结构体指针SDIO设备控制器 irqHandlervoid函数指针无HDF_STATUS相关状态注册SDIO中断releaseIrqdev结构体指针SDIO设备控制器无HDF_STATUS相关状态释放SDIO中断findFuncdev结构体指针SDIO设备控制器 configData结构体指针SDIO函数关键信息无HDF_STATUS相关状态寻找匹配的funcNumclaimHostdev结构体指针SDIO设备控制器无HDF_STATUS相关状态独占HOSTreleaseHostdev结构体指针SDIO设备控制器无HDF_STATUS相关状态释放HOST 说明 CommonInfo包括maxBlockNum单个request中最大block数、maxBlockSize单个block最大字节数、maxRequestSize单个Request最大字节数、enTimeout最大超时时间毫秒、funcNum功能编号1~7、irqCapIRQ capabilities、(void *)data。 开发步骤 SDIO模块适配包含以下四个步骤 实例化驱动入口 实例化HdfDriverEntry结构体成员。 调用HDF_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 配置属性文件 在device_info.hcs文件中添加deviceNode描述。 【可选】添加sdio_config.hcs器件属性文件。 实例化SDIO控制器对象 初始化SdioDevice成员。 实例化SdioDevice成员SdioDeviceOps。 说明 实例化SdioDevice成员SdioDeviceOps其定义和成员说明见接口说明。 驱动调试 【可选】针对新增驱动程序建议验证驱动基本功能例如SDIO控制状态中断响应情况读写数据是否成功等。 开发实例 下方将以//drivers/hdf_core/adapter/khdf/linux/model/storage/sdio_adapter.c为示例展示需要驱动适配者提供哪些内容来完整实现设备功能。 实例化驱动入口 驱动入口必须为HdfDriverEntry在hdf_device_desc.h中定义类型的全局变量且moduleName要和device_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总形成一个类似数组的段地址空间方便上层调用。 一般在加载驱动时HDF会先调用Bind函数再调用Init函数加载该驱动。当Init调用异常时HDF框架会调用Release释放驱动资源并退出。 SDIO 驱动入口参考 struct HdfDriverEntry g_sdioDriverEntry {.moduleVersion 1,.Bind Hi35xxLinuxSdioBind, // 见Bind开发参考.Init Hi35xxLinuxSdioInit, // 见Init开发参考.Release Hi35xxLinuxSdioRelease, // 见Release开发参考.moduleName HDF_PLATFORM_SDIO, // 【必要且与HCS文件中里面的moduleName匹配】 }; HDF_INIT(g_sdioDriverEntry); // 调用HDF_INIT将驱动入口注册到HDF框架中 配置属性文件 完成驱动入口注册之后下一步请在//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs文件中添加deviceNode信息并在sdio_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关器件属性值与核心层SdioDevice成员的默认值或限制范围有密切关系。本例只有一个SDIO控制器如有多个器件信息则需要在device_info.hcs文件增加deviceNode信息以及在sdio_config文件中增加对应的器件属性。 独立服务模式的特点是device_info.hcs文件中设备节点代表着一个设备对象如果存在多个设备对象则按需添加注意服务名与驱动私有数据匹配的关键字名称必须唯一。其中各项参数如表2所示 表 2 device_info.hcs节点参数说明 成员名值policy驱动服务发布的策略SDIO设备控制器具体配置为1表示驱动对内核态发布服务priority驱动启动优先级0-200值越大优先级越低。SDIO设备控制器具体配置为30permission驱动创建设备节点权限SDIO设备控制器具体配置为0664moduleName驱动名称SDIO设备控制器固定为hi3516_mmc_driverserviceName驱动对外发布服务的名称SDIO设备控制器服务名设置为HDF_PLATFORM_MMC_2deviceMatchAttr驱动私有数据匹配的关键字SDIO设备控制器设置为hi3516_mmc_sdio device_info.hcs 配置参考 root {device_info {match_attr hdf_manager;platform :: host {hostName platform_host;priority 50;device_sdio :: device {device0 :: deviceNode {policy 1;priority 70;permission 0644;moduleName HDF_PLATFORM_SDIO; // 【必要】用于指定驱动名称需要与驱动Entry中的moduleName一致。serviceName HDF_PLATFORM_MMC_2; // 【必要】驱动对外发布服务的名称必须唯一。deviceMatchAttr hisilicon_hi35xx_sdio_0; // 【必要】用于配置控制器私有数据要与sdio_config.hcs中对应控制器保持一致。}}}} } sdio_config.hcs 配置参考 root {platform {sdio_config {template sdio_controller {match_attr ;hostId 2; // 【必要】模式固定为2在mmc_config.hcs有介绍。devType 2; // 【必要】模式固定为2在mmc_config.hcs有介绍。}controller_0x2dd1 :: sdio_controller {match_attr hisilicon_hi35xx_sdio_0; // 【必要】需要和device_info.hcs中的deviceMatchAttr值一致。}} } 需要注意的是新增sdio_config.hcs配置文件后必须在hdf.hcs文件中包含sdio_config.hcs所在路径信息否则配置文件无法生效。 实例化SDIO设备控制器对象 完成属性文件配置之后下一步就是以核心层SdioDevice对象的初始化为核心包括驱动适配者自定义结构体传递参数和数据实例化SdioDevice成员SdioDeviceOps让用户可以通过接口来调用驱动底层函数实现HdfDriverEntry成员函数Bind、Init、Release。 自定义结构体参考 从驱动的角度看自定义结构体是参数和数据的载体而且sdio_config.hcs文件中的数值会被HDF读入并通过DeviceResourceIface来初始化结构体成员一些重要数值也会传递给核心层对象。 typedef struct {uint32_t maxBlockNum; // 单个request最大的block个数uint32_t maxBlockSize; // 单个block最大的字节数1~2048uint32_t maxRequestSize; // 单个request最大的字节数1~2048uint32_t enTimeout; // 最大超时时间单位毫秒且不能超过一秒。uint32_t funcNum; // 函数编号1~7uint32_t irqCap; // 中断能力void *data; // 私有数据 } SdioFuncInfo;// SdioDevice是核心层控制器结构体其中的成员在Bind函数中会被赋值。 struct SdioDevice {struct SdDevice sd;struct SdioDeviceOps *sdioOps;struct SdioRegister sdioReg;uint32_t functions;struct SdioFunction *sdioFunc[SDIO_MAX_FUNCTION_NUMBER];struct SdioFunction *curFunction;struct OsalThread thread; // 中断线程struct OsalSem sem;bool irqPending;bool threadRunning; }; SdioDevice成员钩子函数结构体SdioDeviceOps的实例化。 static struct SdioDeviceOps g_sdioDeviceOps {.incrAddrReadBytes Hi35xxLinuxSdioIncrAddrReadBytes,.incrAddrWriteBytes Hi35xxLinuxSdioIncrAddrWriteBytes,.fixedAddrReadBytes Hi35xxLinuxSdioFixedAddrReadBytes,.fixedAddrWriteBytes Hi35xxLinuxSdioFixedAddrWriteBytes,.func0ReadBytes Hi35xxLinuxSdioFunc0ReadBytes,.func0WriteBytes Hi35xxLinuxSdioFunc0WriteBytes,.setBlockSize Hi35xxLinuxSdioSetBlockSize,.getCommonInfo Hi35xxLinuxSdioGetCommonInfo,.setCommonInfo Hi35xxLinuxSdioSetCommonInfo,.flushData Hi35xxLinuxSdioFlushData,.enableFunc Hi35xxLinuxSdioEnableFunc,.disableFunc Hi35xxLinuxSdioDisableFunc,.claimIrq Hi35xxLinuxSdioClaimIrq,.releaseIrq Hi35xxLinuxSdioReleaseIrq,.findFunc Hi35xxLinuxSdioFindFunc,.claimHost Hi35xxLinuxSdioClaimHost,.releaseHost Hi35xxLinuxSdioReleaseHost, }; Bind函数开发参考 入参 HdfDeviceObject是整个驱动对外提供的接口参数具备HCS配置文件的信息。 返回值 HDF_STATUS相关状态 表3为部分展示如需使用其他状态可参考//drivers/hdf_core/interfaces/inner_api/utils/hdf_base.h中HDF_STATUS的定义。 表 3 HDF_STATUS相关状态说明 状态(值)问题描述HDF_ERR_INVALID_OBJECT控制器对象非法HDF_ERR_MALLOC_FAIL内存分配失败HDF_ERR_IOI/O 错误HDF_SUCCESS初始化成功HDF_FAILURE初始化失败函数说明 初始化自定义结构体对象初始化SdioCntlr成员调用核心层SdioCntlrAdd函数以及其他驱动适配者自定义初始化操作。 static int32_t Hi35xxLinuxSdioBind(struct HdfDeviceObject *obj) {struct MmcCntlr *cntlr NULL;int32_t ret;......cntlr (struct MmcCntlr *)OsalMemCalloc(sizeof(struct MmcCntlr));// 分配内存......cntlr-ops g_sdioCntlrOps; // 【必要】struct MmcCntlrOps g_sdioCntlrOps{// .rescanSdioDev Hi35xxLinuxSdioRescan,};cntlr-hdfDevObj obj; // 【必要】使HdfDeviceObject与MmcCntlr可以相互转化的前提obj-service cntlr-service; // 【必要】使HdfDeviceObject与MmcCntlr可以相互转化的前提ret Hi35xxLinuxSdioCntlrParse(cntlr, obj); // 【必要】初始化cntlr的index、devType失败则goto _ERR。......ret MmcCntlrAdd(cntlr); // 【必要】调用核心层mmc_core.c的函数失败则goto _ERR。......ret MmcCntlrAllocDev(cntlr, (enum MmcDevType)cntlr-devType); // 【必要】调用核心层mmc_core.c的函数失败则goto _ERR。......MmcDeviceAddOps(cntlr-curDev, g_sdioDeviceOps); // 【必要】调用核心层mmc_core.c的函数钩子函数挂载。HDF_LOGD(Hi35xxLinuxSdioBind: Success!);return HDF_SUCCESS;_ERR:Hi35xxLinuxSdioDeleteCntlr(cntlr);HDF_LOGE(Hi35xxLinuxSdioBind: Fail!);return HDF_FAILURE; } Init函数开发参考 入参 HdfDeviceObject是整个驱动对外提供的接口参数具备HCS配置文件的信息。 返回值 HDF_STATUS相关状态。 函数说明 无操作可根据驱动适配者需要添加。 static int32_t Hi35xxLinuxSdioInit(struct HdfDeviceObject *obj) {(void)obj; // 无操作可根据驱动适配者的需要进行添加HDF_LOGD(Hi35xxLinuxSdioInit: Success!);return HDF_SUCCESS; } Release函数开发参考 入参 HdfDeviceObject是整个驱动对外提供的接口参数具备HCS配置文件的信息。 返回值 无。 函数说明 释放内存和删除控制器该函数需要在驱动入口结构体中赋值给Release接口当HDF框架调用Init函数初始化驱动失败时可以调用Release释放驱动资源。 说明 所有强制转换获取相应对象的操作前提是在Bind函数中具备对应赋值的操作。 static void Hi35xxLinuxSdioRelease(struct HdfDeviceObject *obj) {if (obj NULL) {return;}Hi35xxLinuxSdioDeleteCntlr((struct MmcCntlr *)obj-service); // 【必要】自定义的内存释放函数这里有HdfDeviceObject到MmcCntlr的强制转换 } 驱动调试 【可选】针对新增驱动程序建议验证驱动基本功能例如SDIO控制状态中断响应情况读写数据是否成功等。 最后 有很多小伙伴不知道学习哪些鸿蒙开发技术不知道需要重点掌握哪些鸿蒙应用开发知识点而且学习时频繁踩坑最终浪费大量时间。所以有一份实用的鸿蒙HarmonyOS NEXT资料用来跟着学习是非常有必要的。  这份鸿蒙HarmonyOS NEXT资料包含了鸿蒙开发必掌握的核心知识要点内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等鸿蒙HarmonyOS NEXT技术知识点。 希望这一份鸿蒙学习资料能够给大家带来帮助有需要的小伙伴自行领取限时开源先到先得~无套路领取 获取这份完整版高清学习路线请点击→纯血版全套鸿蒙HarmonyOS学习资料 鸿蒙HarmonyOS NEXT最新学习路线 HarmonOS基础技能 HarmonOS就业必备技能  HarmonOS多媒体技术 鸿蒙NaPi组件进阶 HarmonOS高级技能 初识HarmonOS内核 实战就业级设备开发 有了路线图怎么能没有学习资料呢小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙OpenHarmony 学习手册共计1236页与鸿蒙OpenHarmony 开发入门教学视频内容包含ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。 获取以上完整版高清学习路线请点击→纯血版全套鸿蒙HarmonyOS学习资料 《鸿蒙 (OpenHarmony)开发入门教学视频》 《鸿蒙生态应用开发V2.0白皮书》 《鸿蒙 (OpenHarmony)开发基础到实战手册》 OpenHarmony北向、南向开发环境搭建 《鸿蒙开发基础》 ArkTS语言安装DevEco Studio运用你的第一个ArkTS应用ArkUI声明式UI开发.…… 《鸿蒙开发进阶》 Stage模型入门网络管理数据管理电话服务分布式应用开发通知与窗口管理多媒体技术安全技能任务管理WebGL国际化开发应用测试DFX面向未来设计鸿蒙系统移植和裁剪定制…… 《鸿蒙进阶实战》 ArkTS实践UIAbility应用网络案例…… 获取以上完整鸿蒙HarmonyOS学习资料请点击→纯血版全套鸿蒙HarmonyOS学习资料 总结 总的来说华为鸿蒙不再兼容安卓对中年程序员来说是一个挑战也是一个机会。只有积极应对变化不断学习和提升自己他们才能在这个变革的时代中立于不败之地。
http://www.zqtcl.cn/news/886548/

相关文章:

  • 专业的设计网站有哪些网站数据库做好了 怎么做网页
  • 鄂州网站建设公司网站制作过程教程
  • 网站建设课程小结二建证考试需要什么条件
  • 比较好的商城网站设计品牌策划案
  • 自适应科技公司网站模板做网站的公司深
  • 网站怎么吸引流量用淘宝做公司网站
  • asp做的网站后台怎么进去老河口城乡建设局网站
  • 中铁建设集团有限公司官方网站wordpress质感
  • 那个网站点击率高pc网站自动生成app
  • 东莞营销型网站建站淘金企业网站建设
  • 怎么用模板做网站手机python编程软件
  • 做视频网站都需要什么软件下载广东网站建设哪家专业
  • 开淘宝的店铺网站怎么做网页设计需要学什么书
  • 如何做收费网站微信小程序开发教程详解
  • 软件下载网站如何履行安全管理义务网站合同书
  • 普宁17网站一起做淘宝网站建设 丽水
  • 网站注册需要多少钱wordpress缓存失败
  • 西安h5响应式网站施工企业安全生产管理规范最新版
  • 电商平台网站建设如何安装网站模版
  • wordpress攻击跳转seo营销软件
  • 广东中山市做网站python做的网站如何部署
  • VPS做镜像网站wordpress 安装七牛
  • 雄安做网站优化的公司小程序开发公司哪里强
  • 做的网站没有注册国家建设部网站倪虹
  • 中英文网站怎么实现做网站有名的公司
  • 先网站开发后软件开发显示网站运行时间代码
  • 品牌网站制作流程图百度网页版入口页
  • 哪些人需要做网站网站开发工程师 招聘
  • 东莞网站建设多长时间如何将网址提交到一些权重比较高的网站
  • 阳江网站seo公司wordpress建站博客