tag 标签: Rockchip

相关博文
  • 热度 3
    2024-3-12 14:55
    272 次阅读|
    0 个评论
    2024年3月7日~8日,第八届瑞芯微开发者大会(RKDC2024)在福州举行,本届大会以“AI芯片·AI应用·AloT”为主题,邀请各行业的开发者共启数智化未来。 本届大会亮点颇多,不仅有13大芯片应用展示、9场产品和技术论坛、4场实战Workshop以及46个生态伙伴的技术展示,还有 新一代AIoT处理器RK3576、音频处理器RK2118及周边芯片等新品发布 ,提供多场景AI应用,为千行百业带来更高效、更稳定、更可靠的AI解决方案。 0 1 热品、新品集体亮相 本届瑞芯微开发者大会,飞凌嵌入式为大家展示了面向工业物联网、电力及新能源、智慧医疗、智慧交通和智慧商业等领域的多元化AIoT产品,不仅有已得到广泛市场应用的FET3588J-C、FET3568J-C和FET3399K-C多款核心板及配套开发板,即将上市的全新FET3562J-C和FET3576-C核心板也一同亮相。 值得注意的是, 飞凌嵌入式作为瑞芯微生态合作伙伴在RK3576处理器的α阶段便参与了产品开发工作,并行业首发了搭载该款处理器的核心板产品——FET3576-C核心板! 更深度的合作,带来更稳定可靠的品质。 RK3576处理器为四核Cortex-A72+四核Cortex-A53架构,主频达2.2GHz,内置6TOPS算力NPU,可为用户提供强大的性能支撑。FET3576-C核心板延续了飞凌嵌入式对处理器全功能引脚引出的设计理念,资源利用率最大化,与FET3588-C核心板的引脚兼容,为客户项目的未来升级预留空间。 FET3576-C核心板和OK3576-C开发板 此外,飞凌嵌入式还展示了“OK3568-C开发板和OK3576-C开发板的EtherCAT展示方案”、“OK3576-C开发板NPU AI识别DEMO”、“FCU2601能耗监测演示DEMO”和“基于OK3588-C开发板的AI识别演示DEMO”,更加直观地展示了飞凌嵌入式RK系列开发板的产品特性,吸引了现场众多观众的驻足。 0 2 生态伙伴,深化合作 2020年以来,飞凌嵌入式与瑞芯微的合作深度愈加紧密,从产品合作开发,到行业应用,再到生态共建,双方合作的深度与广度都在不断强化。 本次大会, 飞凌嵌入式产品总监杜工受邀进行了《基于RT-Linux的工业实时性保障及应用案例》主题演讲 ,与现场的观众与伙伴分享了飞凌嵌入式的实时Linux开发经验,并对开发示例和成果进行详细讲解。 杜工提到,飞凌嵌入式已为包括全新FET3576-C核心板在内的多款核心板产品完成了RT-Linux适配,并快速搭建了EtherCAT主站系统这种典型RT-Linux应用,可以为开发者提供设计参考。 多年来,飞凌嵌入式始终致力于让客户的产品研发更简单、更高效,让客户的产品更智能、更稳定,积极主动地营造有利于行业长远发展的市场环境,为稳增长赋能。 为期两天的RKDC2024,是一场聚焦AI领域,将前沿技术理论与实践应用深度融合的科技盛会。在未来飞凌嵌入式仍将与瑞芯微强强联手,并与广大客户朋友及产业上下游同仁携手前行,共同推动产业价值链优化升级,助力数智升级、万物芯生。
  • 热度 11
    2023-8-16 15:19
    1345 次阅读|
    0 个评论
    嵌入式系统中如何选择RTC电池?
    RTC(Real Time Clock)是一种用于提供系统时间的独立定时器,它可以在系统断电或低功耗模式下继续运行,只需要一个后备电池作为供电源。在嵌入式系统中,选择合适的RTC电池时非常关键的,它会影响系统时间的准确性和稳定性。 在选择嵌入式系统中的RTC电池时,需要考虑以下几个重要因素: 电压:RTC电池的电压应与RTC芯片的工作电压一致,一般为3V或1.8V。如果电压过高或过低,会造成RTC芯片无法正常工作或损坏。 容量:RTC电池的容量决定了它能够提供多长时间的后备电源。容量越大,使用寿命越长,但是成本和体积也越大。一般来说,RTC电池的容量应该能够支持至少10年的使用。 温度:RTC电池的温度特性会影响其输出电压和容量。不同类型的RTC电池适用于不同的温度范围,例如-40°C~85°C、-20°C~70°C和0°C~50°C等。在选择RTC电池时,需要考虑系统所处的环境温度,并选择合适的温度范围。 成本:RTC电池的成本也是一个重要的考虑因素,它会影响系统的整体成本和效益。在满足系统需求的前提下,应该选择性价比高的RTC电池。 可充电:RTC可充电电池可以在系统运行期间通过外部电源进行充电,延长系统的使用时间,不可充电电池只能使用一次,用完后需更换。 常用的RTC电池类型有以下几种: 纽扣电池:纽扣电池是一种圆形的小型锂电池,如CR2032,可以安装在电池底座上或外接电源线连接主板。纽扣电池不可充电,但具有体积小、容量大、温度范围广、操作简单、方便更换等优点,是最常用的RTC电池类型之一。 超级电容:超级电容是一种具有高能量密度和高功率密度的储能器件,可以直接焊接在主板上或通过插座连接。超级电容具有充放电速度快、寿命长、无记忆效应、环保等优点,但是其容量较小、自放电速度快、温度特性差等缺点,限制了其在RTC中的应用。 锂离子聚合物电池:锂离子聚合物电池是一种柔性、可塑性高的锂离子二次电池,可以根据系统设计需求定制形状和尺寸。锂离子聚合物电池具有容量大、重量轻、安全性高等优点,但是其成本高、充放电次数有限、需要专用充放电管理芯片等缺点,使得其在RTC中的应用较少。 总之,在嵌入式系统中选择RTC电池时,需要综合考虑各种因素,并根据系统设计需求和实际情况进行权衡和选择。
  • 热度 6
    2023-7-27 17:21
    1627 次阅读|
    0 个评论
    soc平台 开发板品牌 sdk版本 开发平台 rv1126 firefly 20211022 ubuntu18.04 64位 学嵌入式开发也有一段时间了,本来也是想搞一款音视频编码器产品,出于这个目的,也验证一下自己的能力。 由于现在开发板是现成的了,引出了对应MIPI CSI的两组总线,需要自己做个HDMI转MIPI的模块,自己根据芯片手册,简单设计了一个LT6911UXC的转换模块(调试板有点脏乱)。 image-20230714165528631 整个硬件平台算是搭建完成了。 这里说是移植,而不是开发的原因是,正好手头上有已经比较完美的驱动了。只是硬件平台的改动而已。 一、根据电路在设备树中增加I2C设备 这里设计的是挂载在I2C2上的,所以 &i2c2{ status = "okay"; clock-frequency = ; lt6911uxc: lt6911uxc@2b { compatible = "LT6911UXC"; reg = ; }; }; 二、根据源码改设备树 都知道,设备树是描述硬件资源的。既然硬件平台改了,那么对于新的硬件平台当然是要在设备树中加入设备和相关信息了 1. 看源码 源码中有这样一个函数 #ifdef CONFIG_OF static int lt6911uxc_parse_of(struct lt6911uxc *lt6911uxc) { struct device *dev = dev; of_node; struct v4l2_fwnode_endpoint *endpoint; struct device_node *ep; int ret; ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX, module_index); ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING, module_facing); ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME, module_name); ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME, len_name); if (ret) { dev_err(dev, "could not get module information!\n"); return -EINVAL; } #if 0 power_gpio = devm_gpiod_get_optional(dev, "power", //电源控制 GPIOD_OUT_LOW); power_gpio)) { dev_err(dev, "failed to get power gpio\n"); power_gpio); return ret; } #endif reset_gpio = devm_gpiod_get_optional(dev, "reset", //复位引脚 GPIOD_OUT_LOW); reset_gpio)) { dev_err(dev, "failed to get reset gpio\n"); reset_gpio); return ret; } plugin_det_gpio = devm_gpiod_get_optional(dev, "plugin-det", //插入检测 GPIOD_IN); plugin_det_gpio)) { dev_err(dev, "failed to get plugin det gpio\n"); plugin_det_gpio); return ret; } #if 0 hpd_ctl_gpio = devm_gpiod_get_optional(dev, "hpd-ctl", //热插拔控制 GPIOD_OUT_HIGH); hpd_ctl_gpio)) { dev_err(dev, "failed to get hpd ctl gpio\n"); hpd_ctl_gpio); return ret; } #endif //获取和配置v4l2相关端点 of_node, NULL); if (!ep) { dev_err(dev, "missing endpoint node\n"); ret = -EINVAL; return ret; } endpoint = v4l2_fwnode_endpoint_alloc_parse(of_fwnode_handle(ep)); if (IS_ERR(endpoint)) { dev_err(dev, "failed to parse endpoint\n"); ret = PTR_ERR(endpoint); return ret; } bus_type != V4L2_MBUS_CSI2 || bus.mipi_csi2.num_data_lanes == 0) { dev_err(dev, "missing CSI-2 properties in endpoint\n"); ret = -EINVAL; goto free_endpoint; } #if 1 xvclk = devm_clk_get(dev, "xvclk"); //如果lt6911的外部时钟是soc提供,则需要进行相关配置 xvclk)) { dev_err(dev, "failed to get xvclk\n"); ret = -EINVAL; goto free_endpoint; } xvclk); if (ret) { dev_err(dev, "Failed! to enable xvclk\n"); goto free_endpoint; } #endif bus.mipi_csi2.num_data_lanes; bus.mipi_csi2; enable_hdcp = false; hpd_ctl_gpio, 0); power_gpio, 1); lt6911uxc_reset(lt6911uxc); ret = 0; free_endpoint: v4l2_fwnode_endpoint_free(endpoint); return ret; } 从整个处理过程中,此函数是在通过devm_gpiod_get_optional这个函数查找设备树中 "power-gpios" , "reset-gpios", "plugin-det-gpios", "hpd-ctl-gpios"相关节点,并进行输入输出模式配置。将返回的结果存储到定义的lt6911uxc私有数据中。 2. 改设备树 根据以上源码,对设备树进行如下配置(根据电路设计,power和HPD的控制这里没有用到,所以这里不做配置) reset-gpios = ; plugin-det-gpios = ; //hpd-ctl-gpios = ; 3. 处理函数函数 复位函数 static void lt6911uxc_reset(struct lt6911uxc *lt6911uxc) { reset_gpio, 0); usleep_range(2000, 2100); reset_gpio, 1); usleep_range(120*1000, 121*1000); reset_gpio, 0); usleep_range(300*1000, 310*1000); } 插入检测函数 static inline bool tx_5v_power_present(struct v4l2_subdev *sd) { int val; struct lt6911uxc *lt6911uxc = to_state(sd); plugin_det_gpio); v4l2_dbg(1, debug, sd, "%s plug det: %s!\n", __func__, 0) ? "int" : "out"); 0); } static irqreturn_t plugin_detect_irq_handler(int irq, void *dev_id) { struct lt6911uxc *lt6911uxc = dev_id; struct v4l2_subdev *sd = sd; /* control hpd output level after 25ms */ // schedule_delayed_work( delayed_work_enable_hotplug, // HZ / 40); tx_5v_power_present(sd); return IRQ_HANDLED; } 三、根据其他摄像头配置完善设备树 &i2c2{ status = "okay"; clock-frequency = ; lt6911uxc: lt6911uxc@2b { compatible = "LT6911UXC"; reg = ; clocks = ; clock-names = "xvclk"; interrupt-parent= ; interrupts=; pinctrl-names = "default"; pinctrl-0 = < ; reset-gpios = ; plugin-det-gpios = ; // hpd-ctl-gpios = ; rockchip,camera-module-index = ; rockchip,camera-module-facing = "back"; rockchip,camera-module-name = "hdmi_in"; //摄像头名称 rockchip,camera-module-lens-name = "lt6911uxc"; //摄像头镜头 port { //v4l2端点配置 ucam_out0: endpoint { remote-endpoint = ; data-lanes = ; }; }; }; }; 四、其他设备树配置 &csi_dphy0 { status = "okay"; ports { #address-cells = ; #size-cells = ; port@0 { reg = ; #address-cells = ; #size-cells = ; /*mipi_in_ucam0: endpoint@1 { reg = ; remote-endpoint = ; data-lanes = ; };*/ mipi_in_ucam0: endpoint@1 { reg = ; remote-endpoint = ; data-lanes = ; }; }; port@1 { reg = ; #address-cells = ; #size-cells = ; csidphy0_out: endpoint@0 { reg = ; remote-endpoint = ; data-lanes = ; }; }; }; }; &mipi_csi2 { status = "okay"; ports { #address-cells = ; #size-cells = ; port@0 { reg = ; #address-cells = ; #size-cells = ; mipi_csi2_input: endpoint@1 { reg = ; remote-endpoint = ; data-lanes = ; }; }; port@1 { reg = ; #address-cells = ; #size-cells = ; mipi_csi2_output: endpoint@0 { reg = ; remote-endpoint = ; data-lanes = ; }; }; }; }; 五、总结 以上也就配置完成了,具体调试过程可以参看我的另一篇文章 RK628底层调试,使用V4L2调试工具抓图-面包板社区 (eet-china.com) rtsp获取demo可以使用瑞芯微SDK自带的 SDK/external/rkmedia/examples/rkmedia_vi_venc_rtsp_test.c
  • 热度 7
    2023-6-16 11:07
    1152 次阅读|
    0 个评论
    ▎引言 嵌入式计算领域一直以来都有着激烈的竞争,RK3568和树莓派4作为两个备受瞩目的平台,引起了广泛的关注。本文将以处理器性能、扩展性、功耗和软件支持等方面对RK3568和树莓派4进行综合比较,以帮助读者更好的了解这两个平台的优势和适用场景。 ▎RK3568 经过多年发展,瑞芯微在通用处理器、机器视觉领域等领域有着丰富的产品线,可以满足不同场景的行业需求。在2020年开发者大会上,瑞芯微发布了RK3568芯片,该芯片采用22nm制程工艺、4核A55架构CPU(主频最高2.0GHz)、MaliG522EE图形处理器(800MHz)、内置NPU可提供1T算力、支持多种外围高速接口等。支持Linux和Andriod系统,主要面向物联网网关、工控平板、车载中控等行业定制市场。 ▎树莓派4 树莓派4作为2019年发布的产品,采用博通BCM2711处理器,该处理器采用28nm制程工艺、4核A72架构(主频最高1.5GHz)、VideoCoreGPU(500MHz)、多种外围接口等。支持多种操作系统,主要面向媒体中心、服务器、物联网设备、机器人等行业应用场景。 简单介绍完RK3568与树莓派4,那么它们有哪些不一样的地方呢?一起来看! ▎RK3568VS树莓派4之处理器性能 处理器性能作为嵌入式计算平台最重要的指标之一,它决定了嵌入式设备的运行速度和响应能力。随着嵌入式系统的应用场景越来越广泛,对处理器性能的要求也越来越高。 RK3568采用了ARMCortex-A55架构的四核心CPU(主频最高2.0GHz)和Mali-G52GPU(800MHz)。 树莓派4搭载了BroadcomBCM2711芯片,拥有四核Cortex-A72CPU(主频1.5GHz)和VideoCoreVIGPU(500MHz)。从处理器性能来看,RK3568在多核性能上略胜一筹,而树莓派4在单核性能上稍有优势。然而,实际应用中的性能取决于具体场景和需求,因此读者需要根据自己的应用场景来选择。 ▎RK3568VS树莓派4之扩展性 嵌入式平台的扩展性对于应对不同的任务和应用至关重要。RK3568提供了丰富的接口,包括USB3.0、PCIe、MIPIDSI和CSI等,可以满足各种外设和传感器的连接需求。 树莓派4也具备了广泛的扩展接口,包括USB3.0、GPIO、HDMI和CSI等。然而,树莓派4在扩展性上略显不足,特别是在存储方面,只提供MicroSD卡扩展,而RK3568支持NVMe和eMMC存储扩展,使得数据存储更加灵活。 ▎RK3568VS树莓派4之功耗 功耗是嵌入式计算平台另一个重要的考量因素。RK3568采用了20nm制程工艺,功耗控制相对较好,能够在低功耗下提供良好的性能。树莓派4则采用了28nm制程的BCM2711芯片,功耗相对较高。对于注重功耗的应用场景,RK3568可能更具优势。 ▎RK3568VS树莓派4之软件支持 嵌入式平台的软件支持直接影响开发者和用户的体验。树莓派4基于RaspberryPiOS操作系统,拥有庞大的社区支持和丰富的软件生态系统,适合初学者和爱好者。RK3568则基于Linux和Android操作系统,具有广泛的软件支持和开发资源,适合专业开发人员和商业应用。因此,根据个人需求和开发经验,选择合适的平台和软件支持是至关重要的。 ▎结论 综上所述,RK3568和树莓派4在处理性能、扩展性、功耗和软件支持等方面都有各自的特点和优势。RK3568在处理性能和存储扩展性上稍占优势,适合对性能要求较高且有较高存储需求的应用。树莓派4则在软件支持和社区生态方面更具优势,适合教育、娱乐和初学者应用。根据个人需求和项目要求,选择合适的平台是关键。无论选择哪个平台,嵌入式计算的未来无疑会因其不断创新和发展而变得更加精彩 ▎RK3568核心板VS树莓派4之部分参数对比 RK3568 树莓派 4 CPU 型号 RockchipRK3568 RaspberryPi4b(BCM2711) 处理器 四核ARMCortex-A55,最高 2.0GHz 四核Cortex-A72,最高1.5GHz 制程工艺 22nm 28nm GPU 800MHz MaliG522EE 500MHzBroadcomVideoCoreVI 内存 最高8GBLPDDR4 2GB 、4GB、8GBLPDDR4(可选) 存储 eMMC8GB/16GB/32GB+SD 卡扩展接口 MicroSD 卡 以太网 2 路,可支持千兆或百兆 1 路、千兆 USB 2 路USB2.0Host,2路USB3.0OTG 2 路USB3.0,2路USB2.0 视频接口 LVDS :最大可支持1280x800@60Hz MIPI_DSI:单路可以最大支持1920x1080@60Hz 双路可以支持最大支持2048x1536@60Hz HDMI :最大支持4096x2304@60Hz EDP :最大支持2560x1600@60Hz 2 路MicroHDMI、支持双屏输出,最大分辨率为4K60Hz+1080p或2*4K30Hz WiFi& 蓝牙 支持 支持 摄像头 1 路MIPICSIRX,1路DVP CSI 摄像头接口 扩展接口 PCIe 接口,GPIO GPIO ,HAT扩展板 操作系统 Linux 、Android、Debian RaspberryPiOS ,Ubuntu等 … … … ▎万象奥科 RK3568 核心板规格参数表 产品名称 HD-RK3568-CORE 核心板 操作系统 Linux 、Android、Debian 加密 支持硬件加密,保护用户应用软件版权 NPU 1T 算力 处理器 RockchipRK3568 四核Cortex-A55 主频 4 核2.0Ghz 内存 LPDDR4/LPDDR4X/DDR4/DDR3/DDR3L/LPDDR3 DDR41/2/4/8GB 电子硬盘 eMMC8GB/16GB/32GB SATA 支持 Wi-Fi 可支持 5G 可支持 显示屏分辨率 1080P100FPS&4K60FPS 显示接口 LVDS 、HDMI、eDP、RGBParallel、MIPI-DSI SmartCard SupportISO-7816 音频接口 支持 摄像头 1 路MIPICSIRX,1路DVP H.264/H.265 1080P60fpsH265/H.264 视频编码 4K60fpsH.265/H.264/VP9 视频解码 USB 2 路USB2.0Host,2路USB3.0OTG 串口 10 路 CAN-Bus 3 路 以太网 2 路,可支持千兆或百兆 PCle 2 路,PCle3.0 SD 卡接口 3 路,SD3.0 I2C 6 路 PWM 16 路 SPI 4 路 ADC 8 通道10位 GPIO 152 机械尺寸 65mm*50mm
  • 热度 3
    2023-6-8 12:09
    2688 次阅读|
    0 个评论
    近期有点全身心投入到了嵌入式驱动的开发意思了,起早贪黑的学习。不过也是,人生的路都是在不断地学习中度过的。对于干了几年的硬件工程师而言,不说硬件是不是很牛了,就是想换换脑子,整天三极管、电阻、电容的,确实让人乏味。思来想去,硬件是软件的基座,驱动是软件沟通硬件的桥梁。倒不如自己整点知识,也方便自己以后调试硬件不是,再说了从软件角度去理解硬件思维,会有很多不同的收获不是。 奋战了一个月,倒是把驱动的基本框架了解七七八八了,兴致使然,图像采集感觉还不错,公司有产品当开发板,也是省下了大部分的学习成本。 硬件基本结构就是:SOC平台为瑞芯微,视频桥接芯片是LT6911UXC,千兆网络接口和基本的电源电路,还有的最小核心板组成就不多说了。 总归是要初始化和调试LT6911UXC的,那么最基础的当然是通过固定的总线去访问和配置其寄存器了,而大多这类芯片都是用的I2C,LT6911UXC也不例外。于是重点看了下I2C总线的驱动实现框架。那么就在已有的基本驱动框架下实验下了 一、基本的驱动框架 #include #include static int lt6911_driver_init(void) { return 0; } static void lt6911_driver_exit(void) { } module_init(lt6911_driver_init); module_exit(lt6911_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("LY"); MODULE_VERSION("V1.0"); 二、 增加I2C的框架 1. 添加一个I2C设备 这一步是通过i2c_add_driver(driver)这个API函数实现的,那么就在驱动加载的时候使用这个函数 static int lt6911_driver_init(void) { int ret; this is lt6911_driver_init\n"); ret= i2c_add_driver(<6911_driver); if(ret<0){ lt6911 i2c driver add error\n"); } return 0; } 那么要按照以上的实现方式,必须要先实现一个I2C设备,这个设备是通过i2c_driver这个结构体实现的 struct i2c_driver lt6911_driver={ .probe=lt6911_driver_probe, .remove=lt6911_driver_remove, .driver={ .owner=THIS_MODULE, .name="lt6911uxc", //没有设备树使用的匹配名 .of_match_table=lt6911_id //使用设备树匹配的设备列表 }, .id_table=lt6911_id_table //无论使不使用设备树,这里必须实现 }; 2. 实现两个函数 从上一步的i2c_driver设备结构体可以看出,需要实现probe和remove函数。probe函数是当I2C设备正确挂载后所执行的函数,remove函数是I2C设备卸载时所执行的函数。 probe函数 int lt6911_driver_probe(struct i2c_client *client, const struct i2c_device_id *id) { this is lt6911_driver_probe\n"); return 0; } remove函数 int lt6911_driver_remove(struct i2c_client *client) { this is lt6911_driver_remove\n"); return 0; } 3. 在设备树中对应的I2C下添加此设备信息 上面两步完成后,编译驱动为KO文件,通过insmod是可以加载此驱动的,但是会发现加载后只会执行到init这一步。那是因为我们没有在设备树中添加相应设备信息。我的板卡是挂在了I2C2上的,于是就进行下面操作 &i2c2{ status = "okay"; clock-frequency = ; lt6911uxc:lt6911uxc@56{ compatible = "lt6911uxc"; status = "okay"; reg = ; //设备的芯片地址,手册都会说明 interrupt-parent = ; interrupts = ; rst-gpio = ; pinctrl-names="default"; pinctrl-0=< ; }; }; 然后重新编译内核,烧录开发板。再此进行加载KO文件,发现可以打印probe函数中设置的打印语句了 image-20230608105838962 4. 实现最简单的读取Chip ID 框架都搭建完成,接下来当然是与芯片交流一下了,阅读了下LT6911UXC相关手册,要想读取寄存器的数据还得改变它的I2C工作模式和切换bank.原因是其内部集成了MCU,而这个MCU也是通过这个I2C在内部已经连接了LT6911UXC处理核心。 那么就要实现i2c的write和read函数了。驱动程序中I2C的读写都是以包的形式发送和接收的,所以我们先封包。封包使用的结构体是struct i2c_msg,最终的读写函数实现如下 static void lt6911_i2c_write( u16 reg, u8 *values, u32 n) { struct i2c_msg msgs ; int err, i; u8 data ; 8; u8 reg_addr = reg & 0xFF; u8 buf = {0xFF, bank}; data = reg_addr; for (i = 0; i < n; i++) data = values ; /* write bank */ addr; msgs .flags = 0; msgs .len = 2; msgs .buf = buf; /* write reg data */ addr; msgs .flags = 0; msgs .len = 1 + n; msgs .buf = data; adapter, msgs, ARRAY_SIZE(msgs)); if(err < 0){ transfer error %d\n",err); } } static int lt6911_i2c_read(u16 reg,u8 *values, u32 n) { int ret; 8; u8 reg_addr = reg & 0xFF; u8 bank_buff ={0xff,bank}; struct i2c_msg msgs ={ addr, .flags=0, .len=2, .buf=bank_buff, }, ={ addr, .flags=0, .len=sizeof(reg_addr), .buf=®_addr, }, ={ addr, .flags=1, .len=sizeof(values), .buf=values, } }; adapter, msgs, ARRAY_SIZE(msgs)); if(ret < 0){ transfer error %d\n",ret); return ret; } return 0; } 读写函数实现没问题了,那么就在init函数中添加调用就可以了 lt6911_i2c_write( 0x80ee, &i2c_enable, 1); lt6911_i2c_read(0x8100,&rdata,1); lt6911_id is %#x\n",rdata); 编译后,再次加载KO文件,发现在写函数中i2c_transfer函数返回值为-6,意思是NO ACK。怎么回事呢,经过询问最近比较火热的Chatgpt,它告诉我了个答案 也就是我们给了设备地址,但是这个函数会将设备地址左移后然后增加读写位,才是真正的发送的地址。而通过开发板命令行中使用I2C工具(命令:i2cdump -y -f 2 0x56)来读取设备寄存器,通过逻辑分析仪抓取后得到 0x56左移一位再加上写标志位,确实是0xAC啊,经过资料的一番查找,对于I2C设备地址,都是七位。而资料给的发送格式0x56是带有读写位的。那么去掉读写位,也就是将0x56右移一位,在最高位加一个零,就得到了0x2B,再次使用I2C工具试下 就这样成功了,翻阅了大量资料。对于一个初学者而言都是在不断地怀疑和比较中找到了答案。还是挺兴奋的。所以我们就要把设备树中的配置更改下 &i2c2{ status = "okay"; clock-frequency = ; lt6911uxc:lt6911uxc@56{ compatible = "lt6911uxc"; status = "okay"; reg = ; //设备的芯片地址,手册都会说明 interrupt-parent = ; interrupts = ; rst-gpio = ; pinctrl-names="default"; pinctrl-0=< ; }; }; 编译内核,烧录。读chipID成功 总结 i2c的读写最关键的就是设备地址了,驱动的框架是固定的。 学习就应该在怀疑中调试,在调试中比较,在比较中得到答案。我们都是站在巨人的肩膀上的,当自己出现问题时,最好是看看巨人都是怎么做的。 原文链接
相关资源
  • 所需E币: 1
    时间: 2019-5-24 16:07
    大小: 937.99KB
    上传者: crystal2k
    目前RK平台上pmu的相关使用说明
  • 所需E币: 1
    时间: 2021-9-27 14:06
    大小: 723.46KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2021-9-27 14:28
    大小: 521.96KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:06
    大小: 772.42KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:07
    大小: 299.75KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:09
    大小: 469.7KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2021-9-27 14:13
    大小: 520.12KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:13
    大小: 455.78KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:14
    大小: 428.88KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2021-9-27 14:27
    大小: 691.82KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:32
    大小: 478.07KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:29
    大小: 641.42KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2021-9-27 14:29
    大小: 825.23KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:31
    大小: 1.38MB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:31
    大小: 494.28KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:32
    大小: 393.58KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2021-9-27 14:33
    大小: 2.12MB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:33
    大小: 748.91KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 1
    时间: 2021-9-27 14:33
    大小: 724.46KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2021-9-27 14:34
    大小: 425.08KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电、微机原理、信号处理等知识是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。