Camera | 7.瑞芯微rk3568平台摄像头控制器MIPI-CSI驱动架构梳理

因为有拍照、录制视频、直播等刚需,现在手机的摄像头基本都是高清,支持高清摄像头的SoC都支持MIPI-CSI。

不同SoC的MIPI-CSI在实现上有一定差别,即使同一厂家设计生产的芯片也都不尽相同。

本文基于瑞芯微rk3568平台evb1公板为例来详细讲解MIPI-CSI/DPHY驱动。

阅读本文之前,建议大家先仔细学习前面几篇文章。

一、rk3568硬件模块部分

驱动的研究往往要先从硬件着手,下面我首先看下rk3568公板电路。

1)电路图

由电路图可得摄像头与SoC的MIPI-CSI接口,可以是x4lane,也可以是x2lane,data和clk都是差分信号。

如果不了解,建议问下硬件工程师。

控制摄像头接口是I2C接口,并且位于I2C通道4下。

2)rk3568内部MIPI相关模块图

电路图只能查看SoC的MIPI控制器与摄像头的接口关系,下面我们来看下rk3568内部与mipi相关的模块。

吐槽一下瑞芯微的文档,一言难尽,我严重怀疑厂家压根就不想让其他人真正搞懂他们的SDK,这样好收每年的技术支持费用,高通这损招是让丫彻底学明白了。

由于官方给的手册要么有错误,要么就是有些图片错误,就不截图了。

下图是根据官方手册说明,整理的内部模块图。

  1. Sensor输出数据流通过MIPI的lanes传输给rk3568的DPHY控制器
  2. CSI控制器从硬件中提取出图像数据
  3. VICAP从MIPI接口读取数据
  4. 然后将数据传递给给ISP ,ISP 再输出经过一系列图像处理算法后得到图像。
  5. MP用于预览图像
  6. SP用于缩放
  • VICAP
    Video Capture通过DVP/MIPI接口从摄像头读取数据,并通过AXI总线将数据传输到主存中。

VICAP特性:

支持 BT601 YCbCr 422 8bit  、 RAW 8/10/12bit 输入
支持 BT656 YCbCr 422 8bit  输入
支持 BT1120 YCbCr 422 8bit 输入 , 单/双边 取样
支持 2/4 mixed BT656/BT1120 YCbCr 422 8bit input
支持 YUYV 序列的配置
支持 the polarity of pixel_clk, hsync and vsync configurable
支持接收 CSI2 协议的数据(最多4个IDs)
支持接收 DSI 协议的数据(Video mode/Command mode)
支持窗口裁剪
支持virtual stride when write to DDR
支持输出NV16/NV12格式的YUV数据
支持compact/non-compact output for RAW data
支持MMU
  • ISP(图像信号处理)

ISP是一个完整的视频和静止图像输入设备。
这个模块支持集成YCbCr处理图像传感器和简单CMOS传感器 ,提交没有任何综合图像处理Bayer RGB模式图像。

rk3568采用的是ISP21版本。

ISP21 包含了一系列的图像处理算法模块,主要包括:暗电流矫正、坏点矫正、3A、HDR、镜头阴影矫
正、镜头畸变矫正、3DLUT、去噪(包括RAW域去噪,多帧降噪,颜色去噪等)、锐化
等。

ISP21包括硬件算法实现及软件逻辑控制部分,RkAiq即为软件逻辑控制部分的实现。

RkAiq不断从ISP HW获取统计数据,并经过3A等算法生成新的参数反馈给各硬件模块。

RkAiq软件模块主要实现的功能为:从ISP驱动获取图像统计,结合IQ Tuning参数,使用一系列算法计
算出新的ISP、Sensor等硬件参数,不断迭代该过程,最终达到最优的图像效果。

3)CSI_RX、VICAP、ISP寄存器基地址

《Rockchip RK3568 TRM Part1 V1.1-20210301.pdf》

二、 瑞芯微MIPI-CSI设备树分析

在rk3568中主要包含4个设备:

  • isp-subdev:
    图像处理控制器,如3a处理,并将处理后的所得的参数反馈给sensor。
  • csi-subdev:
    mipi数据解析控制器。
  • cis2-dphy:
    mipi数据硬件接收控制器。
  • sensor:
    外接的sensor,支持mipi输出。

下面我看下瑞芯微MIPI-CSI是如何用设备树描述的。

1. 内核中相关MIPI设备树说明文档

瑞芯微MIPI-CSI设备树节点属性说明参考内核说明文档:

[kernel\Documentation\devicetree\bindings\media]
video-interfaces.txt             关于sensor节点属性的说明,接口类型,
rockchip-isp1.txt                isp模块属性说明
rockchip-mipi-dphy.txt           dphy模块的说明
kernel\Documentation\devicetree\bindings\media\i2c\ovxxxxxx.txt  ov系列的摄像设备树说明

2. 设备树节点说明

rk3568的MIPI-CSI用到的所有的设备树节点:

a) rockchip,rkisp-vir

rkisp_vir0: rkisp-vir0 {compatible = "rockchip,rkisp-vir";rockchip,hw = <&rkisp>;status = "disabled";
};    

该设备树信息对应的初始化函数

[kernel\drivers\media\platform\rockchip\isp\dev.c]
struct platform_driver rkisp_plat_drv = {.driver = {.name = DRIVER_NAME,.of_match_table = of_match_ptr(rkisp_plat_of_match),.pm = &rkisp_plat_pm_ops,},.probe = rkisp_plat_probe,.remove = rkisp_plat_remove,
};

该节点用于初始化isp相关的组件,

驱动程序会创建拓扑图中的 rkisp-isp-subdev、rkisp-csi-subdev、rkisp_mainpath、rkisp_selfpath、rkisp_rawwr0、rkisp_rawwr2、rkisp_rawwr3、rkisp_rawrd0_m、rkisp_rawrd2_s、rkisp-statistics、、rkisp-input-params 组件

isp硬件相关的信息在父节点**rockchip,hw = <&rkisp>;**中描述。

b) rkisp

rkisp: rkisp@fdff0000 {compatible = "rockchip,rk3568-rkisp";reg = <0x0 0xfdff0000 0x0 0x10000>;interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>; //中断使用的gpio,触发方式高电平触发interrupt-names = "mipi_irq", "mi_irq", "isp_irq"; //中断名称clocks = <&cru ACLK_ISP>, <&cru HCLK_ISP>, <&cru CLK_ISP>; //时钟clock-names = "aclk_isp", "hclk_isp", "clk_isp";   //时钟名称resets = <&cru SRST_ISP>, <&cru SRST_H_ISP>;reset-names = "isp", "isp-h";rockchip,grf = <&grf>;   power-domains = <&power RK3568_PD_VI>;     //isp vicap电源和时钟iommus = <&rkisp_mmu>;                //mmu属性rockchip,iq-feature = /bits/ 64 <0x3FBFFFE67FF>;status = "disabled";
};    rkisp_mmu: iommu@fdff1a00 {compatible = "rockchip,iommu-v2";reg = <0x0 0xfdff1a00 0x0 0x100>;interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;interrupt-names = "isp_mmu";clocks = <&cru ACLK_ISP>, <&cru HCLK_ISP>;clock-names = "aclk", "iface";power-domains = <&power RK3568_PD_VI>;#iommu-cells = <0>;rockchip,disable-mmu-reset;status = "disabled";};pmu: power-management@fdd90000 {pd_vi@RK3568_PD_VI {reg = <RK3568_PD_VI>;clocks = <&cru HCLK_VI>,<&cru PCLK_VI>;pm_qos = <&qos_isp>,<&qos_vicap0>,<&qos_vicap1>;};
};

该设备树节点用于描述ISP硬件信息:
基地址0xfdff0000 、中断源、时钟、reset引脚、iommus等。

驱动提取对应的硬件信息,填充到struct rkisp_hw_dev结构体变量中。

对应驱动入口:

[kernel\drivers\media\platform\rockchip\isp\hw.c]
static struct platform_driver rkisp_hw_drv = {.driver = {.name = "rkisp_hw",.of_match_table = of_match_ptr(rkisp_hw_of_match),.pm = &rkisp_hw_pm_ops,},.probe = rkisp_hw_probe,.remove = rkisp_hw_remove,.shutdown = rkisp_hw_shutdown,
};

c) CSI2协议相关设备树

  • csi2_dphy0
    拓扑结构相关信息
  • csi2_dphy_hw
    csi2驱动相关硬件信息

以下是描述csi2_dphy0拓扑信息,实际摄像头信息需要用户自己填写:

[rk3568-evb1-ddr4-v10.dtsi]
&csi2_dphy0 {status = "okay";ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;mipi_in_ucam0: endpoint@1 {reg = <1>;remote-endpoint = <&0v13850_out>;data-lanes = <1 2 3 4>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;csidphy_out: endpoint@0 {reg = <0>;remote-endpoint = <&isp0_in>;};};};
};

该节点描述内容:

- 父节点csi2_dphy0 
- port@n          : 表示pad号为n
- mipi_in_ucam0   : Sink Pad(in表示进入该entity,上游连接的设备由remote-endpoint给出,即摄像头0v13850_out)
- data-lanes      : mipi通道数量:4
- csidphy_out     : Source Pad,下游连接的设备由remote-endpoint给出,即isp0_in

以下是csi2_dphy控制器相关硬件信息,位于瑞芯微3568平台设备树文件rk3568.dtsi中

[rk3568.dtsi]
aliases {csi2dphy0 = &csi2_dphy0;……
}
csi2_dphy0: csi2-dphy0 {compatible = "rockchip,rk3568-csi2-dphy";rockchip,hw = <&csi2_dphy_hw>;status = "disabled";
};csi2_dphy_hw: csi2-dphy-hw@fe870000 {compatible = "rockchip,rk3568-csi2-dphy-hw";reg = <0x0 0xfe870000 0x0 0x1000>;clocks = <&cru PCLK_MIPICSIPHY>;clock-names = "pclk";rockchip,grf = <&grf>;status = "disabled";
};

csi2dphy0 对应的驱动入口为:

[kernel\drivers\phy\rockchip\phy-rockchip-csi2-dphy-hw.c]
static struct platform_driver rockchip_csi2_dphy_hw_driver = {.probe = rockchip_csi2_dphy_hw_probe,.remove = rockchip_csi2_dphy_hw_remove,.driver = {.name = "rockchip-csi2-dphy-hw",.of_match_table = rockchip_csi2_dphy_hw_match_id,},
};

在函数rockchip_csi2_dphy_hw_probe()中还会注册结构体变量 rockchip_csi2_dphy_driver

630    platform_driver_register(&rockchip_csi2_dphy_driver);

rockchip_csi2_dphy_driver定义如下:


[kernel\drivers\phy\rockchip\phy-rockchip-csi2-dphy-hw.c]
struct platform_driver rockchip_csi2_dphy_driver = {.probe = rockchip_csi2_dphy_probe,.remove = rockchip_csi2_dphy_remove,.driver = {.name = "rockchip-csi2-dphy",.pm = &rockchip_csi2_dphy_pm_ops,.of_match_table = rockchip_csi2_dphy_match_id,},
};

分析驱动就要从这些入口函数probe开始分析。

三、驱动初始化

1. 驱动文件目录

kernel├── arch/arm64/boot/dts/rockchip DTS 配置文件├── drivers/phy/rockchip/├── phy-rockchip-csi2-dphy.c└── phy-rockchip-csi2-dphy-hw.c mipi dphy 驱动	    ├── drivers/media|├── platform/rockchip/isp rkisp isp 驱动│                   ├── capture_v21.c 包含 mp/sp 的配置及 vb2,帧中断处理  │                   ├── dev.c 包含 probe、异步注册、 clock、 pipeline、iommu 及 media/v4l2 framework│                   ├── isp_params_v21.c 3A 相关参数设置│                   ├── isp_stats_v21.c 3A 相关统计│                   ├── regs.c 寄存器相关的读写操作│                   └──  rkisp.c 对应 isp_sd entity 节点,│                       包含从 mipi 接收数据,并有 crop 功能├── v4l2-core  v4l2核心代码└── i2c/└── ov13850.c CIS(cmos image sensor)驱动

注:
3568的isp版本是v21,只需要看v21结尾的文件

1. 字符设备号申请:videodev_init()

该函数主要用于申请设备号:

主设备号 :81
设备名 :video4linux
申请class:video4linux

#define VIDEO_MAJOR	81
#define VIDEO_NUM_DEVICES	256
#define VIDEO_NAME              "video4linux"static struct class video_class = {.name = VIDEO_NAME,.dev_groups = video_device_groups,
};
static int __init videodev_init(void)
{dev_t dev = MKDEV(VIDEO_MAJOR, 0);ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);ret = class_register(&video_class);
}
static void __exit videodev_exit(void)
{dev_t dev = MKDEV(VIDEO_MAJOR, 0);class_unregister(&video_class);unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
}

注意
为简化起见,所有代码只把最重要的部分列举出来,后同。

2. isp架构初始化:rkisp_plat_probe()

该函数是最重要的一个初始化函数,除了rkisp_csi2_dphy(entity67)外,其他的功能部件都在该函数中初始化。

注册rkisp-vir0父设备、isp-dubdev子设备、csi2-dev子设备等,由于rk3568支持多路sensor输入,即isp支持多路处理,因此会虚拟多通道isp-virx。

该函数主要工作:

  1. 给isp_dev申请内存并初始化,该结构体用于camera控制器所有的信息
  2. 注册v4l2_device结构体
  3. 初始化media相关资源
  4. 函数rkisp_register_platform_subdevs(),用于注册拓扑结构中的各个模块,对应的entity详见图
  5. entity1、7注册为sub_device
    初始化struct v4l2_subdev_ops、初始化media子模块需要相关信息
    entity1还会设置默认的图像格式
  6. entity13、19、25、31、37、43、49、55、61注册为video_device
    填充struct v4l2_file_operations(struct video_device->fops)、struct v4l2_ioctl_ops(struct video_device->ioctl_ops),struct vb2_ops(struct video_device->vb2_queue->ops)

![ ](https://img-blog.csdnimg.cn/796972bedb2046e89d3e3772fec31a9b.png

其中对于研发人员最重要的就是这些回调函数,应用层下发的各个命令最终都会通过架构调用到这些函数。

下面把重要的几个模块所注册的回调函数做了个总结:

这些回调函数在架构中关系参考下图:

其中entity67相关资源是在函数rockchip_csi2_dphy_probe()中注册。

3. isp驱动初始化:rkisp_hw_probe()

该函数主要初始化isp驱动

static const struct of_device_id rkisp_hw_of_match[] = {……{.compatible = "rockchip,rk3568-rkisp",.data = &rk3568_isp_match_data,},{},
};640 static int rkisp_hw_probe(struct platform_device *pdev)
641 {    
646 	struct rkisp_hw_dev *hw_dev;                                                                                                                                                                                                                                                                                                                                                          ……/*匹配设备树compatible属性*/
651     match = of_match_node(rkisp_hw_of_match, node);
654 	/*为hw_dev 分配内存*/
655     hw_dev = devm_kzalloc(dev, sizeof(*hw_dev), GFP_KERNEL);
659     dev_set_drvdata(dev, hw_dev);//dev->driver_data
660     hw_dev->dev = dev;
661     hw_dev->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP);
662     dev_info(dev, "is_thunderboot: %d\n", hw_dev->is_thunderboot);
663     hw_dev->max_in.w = 0;
664     hw_dev->max_in.h = 0;
665     hw_dev->max_in.fps = 0;//获得grf句柄*/
669     hw_dev->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
672     /*获取控制器物理地址
673     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);/*将物理地址映射为基地址*/
679     hw_dev->base_addr = devm_ioremap_resource(dev, res);694     match_data = match->data;
695     hw_dev->mipi_irq = -1;
696 
697     hw_dev->pdev = pdev;
698     hw_dev->match_data = match_data;
699     if (!hw_dev->is_thunderboot)
700         rkisp_register_irq(hw_dev);  //注册中断
701 	/*从设备树中提取时钟*/
702     for (i = 0; i < match_data->num_clks; i++) {
703         struct clk *clk = devm_clk_get(dev, match_data->clks[i]);
704 
707         hw_dev->clks[i] = clk;
708     }
709     hw_dev->num_clks = match_data->num_clks;
710     hw_dev->clk_rate_tbl = match_data->clk_rate_tbl;
711     hw_dev->num_clk_rate_tbl = match_data->num_clk_rate_tbl;
712 	/*提取reset属性*/
713     hw_dev->reset = devm_reset_control_array_get(dev, false, false);
718 
719     ret = of_property_read_u64(node, "rockchip,iq-feature", &hw_dev->iq_feature);
720     if (!ret)
721         hw_dev->is_feature_on = true;
722     else
723         hw_dev->is_feature_on = false;
724 	/*初始化其他的一些变量*/
725     hw_dev->dev_num = 0;…………
743     hw_dev->is_shutdown = false;
744     hw_dev->is_mmu = is_iommu_enable(dev);
745     ret = of_reserved_mem_device_init(dev);…………
770 }

4. mipi接口dphy驱动初始化:rockchip_csi2_dphy_probe()、rockchip_csi2_dphy_hw_probe()

学习更多嵌入式、Linux相关知识,后台留言加我好友!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38858.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3 海康视觉平台VisionMaster 上手系列:通讯

VisionMaster 通讯中 常用的工具&#xff1a;1&#xff0c;接收数据。 2&#xff0c;协议解析。 3&#xff0c;格式化。 4&#xff0c;发送数据。 以上4个工具是 通讯中用到的工具。根据红框&#xff0c;字面意思就可以理解&#xff0c;使用。就是接受字符串&#xff0c;拆分字…

景嘉微GPU与显卡

景嘉微GPU与显卡 图形处理器&#xff08;GPU&#xff09;芯片-JM7200 分享&#xff1a; JM7200采用28nm CMOS工艺&#xff0c;支持4K超高清显示&#xff0c;支持4路独立显示输出&#xff0c;支持十屏同时输出&#xff0c;提供多种丰富的外设接口&#xff0c;可高效完成2D、3D图…

chatgpt赋能python:Python连续输出的技巧

Python连续输出的技巧 Python是一种简单易学的高级编程语言。它具有易于阅读和编写的语法&#xff0c;同时也有足够的功能来进行复杂的编程任务。Python被广泛用于各种应用程序&#xff0c;从Web应用程序到数据分析和人工智能等。在这篇文章中&#xff0c;我们将探讨如何使用P…

(分步解释)----扑克随机洗牌

JavaScript中输出随机数的方法&#xff1a; <1> 系统Math对象里的random方法。 例如&#xff1a;输出1—6的随机数,包括1和6。 <script>/*1到5的随机数 包括1和5*/console.log(parseInt(Math.random()* 6) 1);</script> 模拟扑克洗牌&#xff1a; <…

排序算法之鸡尾酒排序

原文&#xff1a;微信公众号&#xff1a;程序员小灰——什么是鸡尾酒排序 1 鸡尾酒排序 鸡尾酒排序是冒泡排序的一种变形。它与冒泡排序的不同之处在于排序时是以双向在序列中进行排序。 2 原理 鸡尾酒排序的原理跟冒泡排序差不多&#xff0c;只不过冒泡排序每一轮的比较都…

算法:鸡尾酒排序

双向冒泡排序也被称为鸡尾酒排序、鸡尾酒调酒器排序、摇床排序、涟漪排序、洗牌排序、班车排序等。&#xff08;再多再华丽丽的名字也难以弥补它的低效&#xff09; 鸡尾酒排序&#xff0c;是冒泡排序的改良大部分元素都有序的时候&#xff0c;可以用鸡尾酒排序、地精排序 冒泡…

一文解决投骰子类的算法题

目录 首先来看一道经典的问题&#xff1a;n个骰子的点数 我们再来看另一个问题&#xff1a;掷骰子的N种方法 牢记投骰子类问题的解决方法&#xff1a;动态规划 首先来看一道经典的问题&#xff1a;n个骰子的点数 题目是这样的&#xff1a;把n个骰子扔在地上&#xff0c;所有…

21天经典算法之冒泡排序

​ ​ 活动地址&#xff1a;CSDN21天学习挑战赛 专栏前言: 本专栏主要是算法训练&#xff0c;目的很简单。就是为了进厂 最近官方在组织 21 天挑战赛&#xff0c;趁此机会我也更新一下经典算法的文章 如果想一起“狂”或者交流&#xff0c;欢迎来私聊 还不快趁着这个机会来提升…

鸡尾酒排序算法详解

一、什么是鸡尾酒排序 1.概念 鸡尾酒排序算法又叫快乐小时排序&#xff0c;它基于冒泡排序算法做了一些优化。冒泡排序算法每一轮都是从左到右进行元素比较&#xff0c;进行单向的位置交换&#xff0c;鸡尾酒排序算法则是双向的元素比较和交换。 2.算法原理 这是一个无序数…

【1072】鸡尾酒疗法

1072&#xff1a;鸡尾酒疗法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 62913 通过数: 27350 【题目描述】 鸡尾酒疗法&#xff0c;指“高效抗逆转录病毒治疗”。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾…

把psd自动生成html,根据psd文件生成html

我是新手&#xff0c;怎样在ps中把psd文件变成html文件呢&#xff1f;我知道要用切片&#xff0c;但是具体步骤怎么做&#xff0c;还有是不是不同的ps版本有差异 不同的ps版本是没有什么差异的&#xff0c;主要用到的就是工具里面的切片&#xff0c;用切片切好图后&#xff0c;…

为什么不要相信AI机器人提供的健康信息?

自从OpenAI、微软和谷歌推出了AI聊天机器人&#xff0c;许多人开始尝试一种新的互联网搜索方式&#xff1a;与一个模型进行对话&#xff0c;而它从整个网络上学到的知识。 专家表示&#xff0c;鉴于之前我们倾向于通过搜索引擎查询健康问题&#xff0c;我们也不可避免地会向Ch…

OpenAI 用于辅助治疗的 GPT-4:AI 如何彻底改变心理健康护理

人工智能&#xff08;AI&#xff09;改变了我们生活的方方面面&#xff0c;从娱乐和教育到医疗保健。人工智能最有前途的应用之一是在心理健康领域&#xff0c;它可以帮助数百万患有抑郁症、焦虑症、创伤后应激障碍 &#xff08;PTSD&#xff09; 和物质使用障碍等各种疾病的人…

大模型惨遭人类大范围攻击!国内各领域专家组团投毒,GPT-4也Hold不住

包括GPT-4在内等多个大模型惨遭人类攻击&#xff01;还是大范围、多边形那种。 而且这个军团被爆个个来头不小。 包括社会学家李银河、心理学家李松蔚、中科院计算研究所王元卓等&#xff0c;覆盖环境、心理、法理、心理、教育、大数据、无障碍等多个领域。 他们专挑刁钻、陷…

苹果AI哪去了?前员工揭秘Siri何以走向没落:团队内耗、技术判断太谨慎

明敏 发自 凹非寺量子位 | 公众号 QbitAI 苹果为何会在最新一轮ChatGPT趋势中“静悄悄”&#xff1f; 答案更进一步浮出水面。 内部团队混乱、决策缓慢、代码笨重&#xff0c;都成为了拖累苹果AI更快前进的原因。 最直接的体现&#xff0c;可以来看Siri。 这大概是大部分普通人…

新规拉开中国生成式AI“百团大战”序幕?

AI将走向何方&#xff1f; ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论&#xff0c;AI该如何管理&#xff1f;AI该如何发展&#xff1f;一系列问题都成为人们热议的焦点。此前&#xff0c;马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代&#xf…

苹果AI哪去了?前员工揭秘Siri何以走向没落:团队内耗、技术判断太谨慎!

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年3月份热门报告合集 万字干货&#xff1a;ChatGPT的工作原理 2023年创业&#xff08;有创业想法&#xff09;必读手册 ChatGPT等让你效率倍增的22个AI工具 ChatGPT调研…

Mac下安装Redis 4.0(服务器端)

系统环境: CentOS 7.4 Redis版本: 4.0 这里采用终端下载解析安装: 1.1 进入/usr/local/目录 cd /usr/local/ 1.2 下载稳定版 wget http://download.redis.io/releases/redis-4.0.10.tar.gz 1.3 解压: tar -zxvf redis-4.0.10.tar.gz 1.4 进入解压后的文件中 cd redis-4.0.10 1.…

Mac下 Gradle4.0 详细安装攻略

macaca更新到2.0.0以上&#xff0c; 安卓需要使用gradle来构建app包&#xff0c;具体见Macaca 基于Python自动化测试框架搭建详解 ——Android、IOS搭建步骤&#xff0c;所以有了以下这篇文章。安装具体步骤如下&#xff1a; 
 • 下载最新的gradle的包&#xff0c;地址为&a…

mdserver(mac版) 4.0.1.0

mdserver(mac版) 4.0.1.0 Mac上高度可定制的PHP开发环境,集成必要的扩展,方便使用。 (pkg安装方式),安装方便,是你Mac上的PHP开发利器。 支持80端口。OpenResty(1.15.8.3)支持Lua开发。Redis(6.2.5),MongoDB(5.0.0),Memcached(1.6.10)。php-fpm以sock文件方式管理。多php进程…