【Linux 驱动】IMX6ULL eLCDIF驱动

news2024/11/24 20:45:07

1. eLCDIF设备树

lcdif: lcdif@021c8000 {
				compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif";    //属性
				reg = <0x021c8000 0x4000>;                             //起始地址 地址大小
				interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;          //中断
				clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,                 //时钟子系统
					 <&clks IMX6UL_CLK_LCDIF_APB>,
					 <&clks IMX6UL_CLK_DUMMY>;
				clock-names = "pix", "axi", "disp_axi";                //系统名称
				status = "disabled";                                   //状态
			};
* Freescale MXS LCD Interface (LCDIF)

Required properties:
- compatible: Should be "fsl,<chip>-lcdif".  Supported chips include
  imx23 and imx28.
- reg: Address and length of the register set for lcdif
- interrupts: Should contain lcdif interrupts
- display : phandle to display node (see below for details)

* display node

Required properties:
- bits-per-pixel : <16> for RGB565, <32> for RGB888/666.
- bus-width : number of data lines.  Could be <8>, <16>, <18> or <24>.

Required sub-node:
- display-timings : Refer to binding doc display-timing.txt for details.

  +----------+-------------------------------------+----------+-------+
  |          |        ↑                            |          |       |
  |          |        |vback_porch                 |          |       |
  |          |        ↓                            |          |       |
  +----------#######################################----------+-------+
  |          #        ↑                            #          |       |
  |          #        |                            #          |       |
  |  hback   #        |                            #  hfront  | hsync |
  |   porch  #        |       hactive              #  porch   |  len  |
  |<-------->#<-------+--------------------------->#<-------->|<----->|
  |          #        |                            #          |       |
  |          #        |vactive                     #          |       |
  |          #        |                            #          |       |
  |          #        ↓                            #          |       |
  +----------#######################################----------+-------+
  |          |        ↑                            |          |       |
  |          |        |vfront_porch                |          |       |
  |          |        ↓                            |          |       |
  +----------+-------------------------------------+----------+-------+
  |          |        ↑                            |          |       |
  |          |        |vsync_len                   |          |       |
  |          |        ↓                            |          |       |
  +----------+-------------------------------------+----------+-------+

Examples:

&lcdif@80030000 {
	pinctrl-names = "default";                    //pinctrl 名字
	pinctrl-0 = <&pinctrl_lcdif_dat               //pinctrl 子系统
		     &pinctrl_lcdif_ctrl
		     &pinctrl_lcdif_reset>;
	display = <&display0>;                        
	status = "okay";                               //状态

	display: display {                             //子节点
		bits-per-pixel = <32>;                     //每个像素点大小
		bus-width = <24>;                          //总线宽度

		display-timings {                          //display-timing子节点
			native-mode = <&timing0>;
			timing0: timing0 {
				clock-frequency = <33500000>;      //时钟频率
				hactive = <800>;                   //水平显示分别率
				vactive = <480>;                   //垂直显示分别率
				hfront-porch = <164>;              //水平方向前肩
				hback-porch = <89>;                //水平方向后肩
				hsync-len = <10>;                  //水平脉冲宽度
				vback-porch = <23>;                //垂直方向后肩
				vfront-porch = <10>;               //垂直方向前肩 
				vsync-len = <10>;                  //垂直脉冲宽度
				hsync-active = <0>;                //水平方向有效脉冲极性
				vsync-active = <0>;                //垂直方向有效脉冲极性
				de-active = <1>;                   //使能有效极性
				pixelclk-active = <0>;             //像素时钟边沿采样有效性
			};
		};
	};
};

2. 相关数据结构

(1)struct  fb_info

Linux内核中使用fb_info结构体变量来描述一个framebuffer,在调用register_framebuffer接口注册framebuffer之前,必须要初始化其中的重要数据成员。

        struct  fb_info中成员众多,我们需要着重关注以下成员:

        fb_var_screeninfo:代表可修改的LCD显示参数,如分辨率和像素比特数等;

        fb_fix_screeninfo:代表不可修改的LCD属性参数,如显示内存的物理地址和长度等;

        fb_ops:LCD底层硬件操作接口集。

struct fb_info 
{
    int node;                       //用来表示该fb设备的次设备号
    int flags;                      //一个标志位
    struct mutex lock;              /* Lock for open/release/ioctl funcs */
    struct mutex mm_lock;           /* Lock for fb_mmap and smem_* fields */
    struct fb_var_screeninfo var;   /* Current var */        //  fb的可变参数
    struct fb_fix_screeninfo fix;   /* Current fix */        //  fb的不可变参数
    struct fb_monspecs monspecs;    /* Current Monitor specs */
    struct work_struct queue;       /* Framebuffer event queue */
    struct fb_pixmap pixmap;        /* Image hardware mapper */
    struct fb_pixmap sprite;        /* Cursor hardware mapper */     
    struct fb_cmap cmap;            /* Current cmap */
    struct list_head modelist;      /* mode list */
    struct fb_videomode *mode;      /* current mode */

#ifdef CONFIG_FB_BACKLIGHT
    /* assigned backlight device */
    /* set before framebuffer registration, remove after unregister */
    struct backlight_device *bl_dev;

    /* Backlight level curve */
    struct mutex bl_curve_mutex;    
    u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdef CONFIG_FB_DEFERRED_IO
    struct delayed_work deferred_work;
    struct fb_deferred_io *fbdefio;
#endif

    struct fb_ops *fbops;          //  该设备对应的操作方法
    struct device *device;         /* This is the parent */     //fb设备的父设备
    struct device *dev;            /* This is this fb device */ //本设备的device
    int class_flag;                /* private sysfs flags */
#ifdef CONFIG_FB_TILEBLITTING
    struct fb_tile_ops *tileops;   /* Tile Blitting */
#endif
    char __iomem *screen_base;     /* Virtual address */        //LCD的显存地址(虚拟地址) 
    unsigned long screen_size;     /* Amount of ioremapped VRAM or 0 *///  LCD显存的字节大小
    void *pseudo_palette;          /* Fake palette of 16 colors */ 
#define FBINFO_STATE_RUNNING    0
#define FBINFO_STATE_SUSPENDED    1
    u32 state;                     /* Hardware state i.e suspend */
    void *fbcon_par;               /* fbcon use-only private area */
    /* From here on everything is device dependent */
    void *par;
    /* we need the PCI or similiar aperture base/size not
       smem_start/size as smem_start may just be an object
       allocated inside the aperture so may not actually overlap */
    struct apertures_struct {
        unsigned int count;
        struct aperture {
            resource_size_t base;
            resource_size_t size;
        } ranges[0];
    } *apertures;
};

struct fb_info

 (2)struct fb_var_screeninfo

Linux内核中使用struct fb_var_screeninfo来描述可修改的LCD显示参数,如分辨率和像素比特数等。

struct fb_var_screeninfo 
{
    __u32 xres;                  //   水平分辨率 
    __u32 yres;                  //   垂直分辨率
    __u32 xres_virtual;          //   虚拟水平分辨率
    __u32 yres_virtual;          //   虚拟垂直分辨率
    __u32 xoffset;               //  当前显存水平偏移量
    __u32 yoffset;               //  当前显存垂直偏移量

    __u32 bits_per_pixel;        //  像素深度
    __u32 grayscale;             /* != 0 Graylevels instead of colors */

    struct fb_bitfield red;      /* bitfield in fb mem if true color, */
    struct fb_bitfield green;    /* else only length is significant */
    struct fb_bitfield blue;
    struct fb_bitfield transp;   /* transparency*/    

    __u32 nonstd;           /* != 0 Non standard pixel format */
    __u32 activate;         /* see FB_ACTIVATE_* */
    __u32 height;           //  LCD的物理高度mm
    __u32 width;            // LCD的物理宽度mm

    __u32 accel_flags;      /* (OBSOLETE) see fb_info.flags */

    /* Timing: All values in pixclocks, except pixclock (of course) */
    __u32 pixclock;            /* pixel clock in ps (pico seconds)  */  //  像素时钟

    //下面这六个就是LCD的时序参数
    __u32 left_margin;        /* time from sync to picture   */
    __u32 right_margin;        /* time from picture to sync  */
    __u32 upper_margin;        /* time from sync to picture  */
    __u32 lower_margin;
    __u32 hsync_len;        /* length of horizontal sync     */
    __u32 vsync_len;        /* length of vertical sync       */

    __u32 sync;            /* see FB_SYNC_*        */
    __u32 vmode;            /* see FB_VMODE_*        */
    __u32 rotate;            /* angle we rotate counter clockwise */
    __u32 reserved[5];        /* Reserved for future compatibility */
};

struct fb_var_screeninfo

(3)struct fb_fix_screeninfo

Linux内核中使用struct fb_fix_screeninfo来描述不可修改的LCD属性参数,如显示内存的物理地址和长度等。

struct fb_fix_screeninfo 
{
    char id[16];                /* identification string eg "TT Builtin" */
    unsigned long smem_start;   // LCD显存的起始地址(物理地址)
                    /* (physical address) */
    __u32 smem_len;            /* Length of frame buffer mem *///  LCD显存的字节大小
    __u32 type;               /* see FB_TYPE_**/
    __u32 type_aux;           /* Interleave for interleaved Planes */
    __u32 visual;             /* see FB_VISUAL_*              */ 
    __u16 xpanstep;           /* zero if no hardware panning  */
    __u16 ypanstep;           /* zero if no hardware panning  */
    __u16 ywrapstep;          /* zero if no hardware ywrap    */
    __u32 line_length;        /* length of a line in bytes    *///  LCD一行的长度 (以字节为单位)
    unsigned long mmio_start; /* Start of Memory Mapped I/O   */
                    /* (physical address) */
    __u32 mmio_len;            /* Length of Memory Mapped I/O  */
    __u32 accel;            /* Indicate to driver which    */
                    /*  specific chip/card we have    */
    __u16 reserved[3];        /* Reserved for future compatibility */
};

struct fb_fix_screeninfo

3. fbmem.c

3.1 入口函数

        FrameBuffer驱动是以模块的形式注册到系统中,在模块初始化时,创建FrameBuffer对应的设备文件及proc文件,并注册FrameBuffer设备操作接口函数fb_fops。

static int __init
fbmem_init(void)
{
	proc_create("fb", 0, NULL, &fb_proc_fops);    //向 proc 文件系统报告驱动状态和参数

	if (register_chrdev(FB_MAJOR,"fb",&fb_fops))    //注册字符设备驱动,主设备号是29 名称为fb
		printk("unable to get major %d for fb devs\n", FB_MAJOR);

	fb_class = class_create(THIS_MODULE, "graphics");    //创建 /sys/class/graphics 设备类,配合 mdev生成设备文件
	if (IS_ERR(fb_class)) {
		printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
		fb_class = NULL;
	}
	return 0;
}

3.2 fb_fops

        在linux设备驱动中,所有的显示缓存设备均由framebuffer子系统内部管理,即linux设备驱动框架只认识一个主设备号为29的framebuffer设备。应用层所有针对显示缓存(最多32个)的访问均会推送给fb_fops进行进一步分发操作。

static const struct file_operations fb_fops = {
	.owner =	THIS_MODULE,
	.read =		fb_read,
	.write =	fb_write,
	.unlocked_ioctl = fb_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl = fb_compat_ioctl,
#endif
	.mmap =		fb_mmap,
	.open =		fb_open,
	.release =	fb_release,
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
	.get_unmapped_area = get_fb_unmapped_area,
#endif
#ifdef CONFIG_FB_DEFERRED_IO
	.fsync =	fb_deferred_io_fsync,
#endif
	.llseek =	default_llseek,
};

3.2.1 fb_open

      

3.2.2 fb_mmap

3.2.3 fb_ioctl 

static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
			unsigned long arg)
{
	struct fb_ops *fb;
	struct fb_var_screeninfo var;
	struct fb_fix_screeninfo fix;
	struct fb_con2fbmap con2fb;
	struct fb_cmap cmap_from;
	struct fb_cmap_user cmap;
	struct fb_event event;
	void __user *argp = (void __user *)arg;
	long ret = 0;

	switch (cmd) {
	case FBIOGET_VSCREENINFO:        // 获取可变屏幕参数
		if (!lock_fb_info(info))
			return -ENODEV;
		var = info->var;
		unlock_fb_info(info);

		ret = copy_to_user(argp, &var, sizeof(var)) ? -EFAULT : 0;
		break;
	case FBIOPUT_VSCREENINFO:        // 设置可变屏幕参数
		if (copy_from_user(&var, argp, sizeof(var)))
			return -EFAULT;
		console_lock();
		if (!lock_fb_info(info)) {
			console_unlock();
			return -ENODEV;
		}
		info->flags |= FBINFO_MISC_USEREVENT;
		ret = fb_set_var(info, &var);
		info->flags &= ~FBINFO_MISC_USEREVENT;
		unlock_fb_info(info);
		console_unlock();
		if (!ret && copy_to_user(argp, &var, sizeof(var)))
			ret = -EFAULT;
		break;
	case FBIOGET_FSCREENINFO:        //获得固定的屏幕参数设置
		if (!lock_fb_info(info))
			return -ENODEV;
		fix = info->fix;
		unlock_fb_info(info);

		ret = copy_to_user(argp, &fix, sizeof(fix)) ? -EFAULT : 0;
		break;
	case FBIOPUTCMAP:                // 获得固定的屏幕参数设置
		if (copy_from_user(&cmap, argp, sizeof(cmap)))
			return -EFAULT;
		ret = fb_set_user_cmap(&cmap, info);
		break;
	case FBIOGETCMAP:                // 获得颜色表
		if (copy_from_user(&cmap, argp, sizeof(cmap)))
			return -EFAULT;
		if (!lock_fb_info(info))
			return -ENODEV;
		cmap_from = info->cmap;
		unlock_fb_info(info);
		ret = fb_cmap_to_user(&cmap_from, &cmap);
		break;
	case FBIOPAN_DISPLAY:            // 平移显示
		if (copy_from_user(&var, argp, sizeof(var)))
			return -EFAULT;
		console_lock();
		if (!lock_fb_info(info)) {
			console_unlock();
			return -ENODEV;
		}
		ret = fb_pan_display(info, &var);
		unlock_fb_info(info);
		console_unlock();
		if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
			return -EFAULT;
		break;
	case FBIO_CURSOR:
		ret = -EINVAL;
		break;
	case FBIOGET_CON2FBMAP:
		if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
			return -EFAULT;
		if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
			return -EINVAL;
		con2fb.framebuffer = -1;
		event.data = &con2fb;
		if (!lock_fb_info(info))
			return -ENODEV;
		event.info = info;
		fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event);
		unlock_fb_info(info);
		ret = copy_to_user(argp, &con2fb, sizeof(con2fb)) ? -EFAULT : 0;
		break;
	case FBIOPUT_CON2FBMAP:
		if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
			return -EFAULT;
		if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
			return -EINVAL;
		if (con2fb.framebuffer >= FB_MAX)
			return -EINVAL;
		if (!registered_fb[con2fb.framebuffer])
			request_module("fb%d", con2fb.framebuffer);
		if (!registered_fb[con2fb.framebuffer]) {
			ret = -EINVAL;
			break;
		}
		event.data = &con2fb;
		console_lock();
		if (!lock_fb_info(info)) {
			console_unlock();
			return -ENODEV;
		}
		event.info = info;
		ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, &event);
		unlock_fb_info(info);
		console_unlock();
		break;
	case FBIOBLANK:
		console_lock();
		if (!lock_fb_info(info)) {
			console_unlock();
			return -ENODEV;
		}
		info->flags |= FBINFO_MISC_USEREVENT;
		ret = fb_blank(info, arg);
		info->flags &= ~FBINFO_MISC_USEREVENT;
		unlock_fb_info(info);
		console_unlock();
		break;
	default:
		if (!lock_fb_info(info))
			return -ENODEV;
		fb = info->fbops;
		if (fb->fb_ioctl)
			ret = fb->fb_ioctl(info, cmd, arg);
		else
			ret = -ENOTTY;
		unlock_fb_info(info);
	}
	return ret;
}

4. mxsfb.c

        一个标准的platform平台设备驱动

4.1 mxsfb_probe

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1小时上手Alibaba Sentinel流控安全组件

微服务的雪崩效应 假如我们开发了一套分布式应用系统&#xff0c;前端应用分别向A/H/I/P四个服务发起调用请求&#xff1a; 但随着时间推移&#xff0c;假如服务 I 因为优化问题&#xff0c;导致需要 20 秒才能返回响应&#xff0c;这就必然会导致20秒内该请求线程会一直处于阻…

Prompt Enginnering(提示工程)

什么是提示工程 prompt enginnering是提示工程的意思&#xff0c;也有叫指令工程。 用白话讲&#xff1a;是我们对GPT说出的话&#xff0c;我们向它提问的信息&#xff0c;就是prompt。 官方一点&#xff1a;是我们使用自然语言提示来控制和优化生成式模型&#xff08;生成式…

《Milvus Cloud向量数据库指南》——SPLADE:基于BERT的Learned稀疏向量技术深度解析

在自然语言处理(NLP)领域,随着深度学习技术的飞速发展,预训练语言模型如BERT(Bidirectional Encoder Representations from Transformers)已成为推动研究与应用进步的重要基石。BERT通过其强大的上下文感知能力,在多项NLP任务中取得了显著成效,尤其是在文本表示和语义理…

深入理解Linux网络(五):TCP接收唤醒

深入理解Linux网络&#xff08;五&#xff09;&#xff1a;TCP接收唤醒 TCP接收唤醒由软中断提供服务。 软中断&#xff08;也就是 Linux ⾥的 ksoftirqd 进程&#xff09;⾥收到数据包以后&#xff0c;发现是 tcp 的包的话就会执⾏到 tcp_v4_rcv 函数。接着如果是 ESTABLISH…

GMSSL2.x编译鸿蒙静态库和动态库及使用

一、编译环境准备 1.1 开发工具 DevEco-Studio下载。 1.2 SDK下载 ​ 下载编译第三方库的SDK有两种方式&#xff0c;第一种方式从官方渠道根据电脑系统选择对应的SDK版本&#xff0c;第二种方式通过DevEco-Studio下载SDK。本文只介绍通过DevEco-Studio下载SDK的方式。 安装…

(十一)Spring教程——Bean基本配置与依赖注入之属性注入

1.Bean基本配置 在进行Bean配置的详细讲解之前&#xff0c;先来了解以下Bean配置的基础知识&#xff0c;以快速建立起Bean配置的初步概念。 1.1装配一个Bean 在Spring容器的配置文件中定义一个简要Bean的配置片段如下所示 <bean id”foo” class”com.smart.Foo”/> 一般…

【VSCode】安装 【ESP-IDF】插件及【ESP32-S3】新建工程和工程配置

一、搭建基础工程 二、基础工程的文件架构解析 三、调试相关工具介绍 1、串口下载2、JTAG 下载与调试 四、工程的文件架构解析 五、基础工程配置 一、搭建基础工程 在 VS Code 中新建 ESP-IDF 基础工程的步骤如下&#xff1a; 1、启动 VS Code 并打开命令面板 按下“Ctrl…

AI+BI结合,数据分析新方向 —— 奥威BI数据可视化引领未来

【AIBI结合&#xff0c;数据分析新方向 —— 奥威BI数据可视化引领未来】 在数字化浪潮汹涌的今天&#xff0c;企业对于数据的洞察力与决策效率的需求日益增长。奥威BI&#xff08;Business Intelligence&#xff09;数据可视化解决方案&#xff0c;以其独特的“AIBI”融合创新…

压缩视频在线免费 怎么免费压缩视频大小 哪个软件可以免费压缩视频

在数字媒体时代&#xff0c;视频文件的体积越来越大&#xff0c;这就需要我们找到高效的方式来压缩视频&#xff0c;以节省存储空间和提升分享速度。本文将为您介绍几款免费的视频压缩软件&#xff0c;帮助您轻松应对视频文件管理难题。 方法一、 安装并打开一款的视频软件。 …

通过iframe嵌套的不同域名的页面之间处理cookie存储失败的问题——js技能提升

最近同事在写mvc的后台管理系统&#xff0c;通过iframe实现不同域名的页面的嵌套。 但是有个问题&#xff0c;就是从父页面打开iframe的子页面时&#xff0c;需要登录子页面&#xff0c;此时需要将子页面登录后的token存储到子页面的cookie中&#xff0c;方便子页面的其他接口…

Python 全栈体系【三阶】(三)

第一章 Django 七、静态文件 1. 概述 静态文件是指在WEB应用中的图像文件、CSS文件、Javascript文件。 2. 静态文件的配置 settings.py中关于静态文件的配置如下&#xff1a; STATICFILES_DIRS [BASE_DIR , static, ]STATIC_URL /static/其中&#xff1a; STATICFILES…

Vue 3 + Vite 项目中安装 Tailwind CSS

官网&#xff1a;安装 - TailwindCSS中文文档 | TailwindCSS中文网 tips&#xff1a;只按照官网的配置可能会导致样式不加载/加载不生效的问题 1、正确安装指令 npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p 自动生成 ​tailwind.config.js​…

鱼眼摄像头-opencv校准(基于棋盘+畸变表)

一&#xff1a;主要参数说明 1&#xff1a;内参矩阵K 是3*3的矩阵&#xff0c;其类似格式 Knp.array([ [389.2109574522624, 0.0, 630.2525667489842], [0.0, 388.505701978078, 360.7886749292513], [0.0, 0.0, 1.0]]) 2&#xff1a;畸变系数 针对鱼眼相机&#xff1a;…

DVWA靶场超(详细教程)--跨站攻击(XSS+CSRF)

一、XSS 反射型xss 打开dvwa的Reflected Cross Site Scripting (XSS) &#xff08;1&#xff09;low等级 查看页面源码&#xff08;ctrlu&#xff09;该界面有提交按钮和输入框 在输入框随便输入点字符&#xff0c;点击提交 可以看见输入的helloword嵌入到界面中。 View sou…

MybatisPlus的使用与详细讲解

今天我们来讲解一下Mybatis的升级版&#xff0c;就是MybatisPlus. MybatisPlus是如何获取实现CRUD的数据库表信息的&#xff1f; 默认以类名驼峰转下划线作为表名 默认把名为id的字段作为主键 默认把变量名驼峰转下划线作为表的字段名 1.MybatisPlus中比较常见的注解 TableN…

红人点集登录逆向+接口逆向:SHA256算法和Webpack反爬

&#x1f50d; 引言 红人点集采取了一系列加密和限制措施&#xff0c;主要是对于参数加密和登录token加密。今天利用Python与JavaScript逆向工程技术&#xff0c;实现逆向登录然后请求接口获取数据。 &#x1f50d; 思路与步骤详解 &#x1f527; 解密登录接口参数&#xf…

安防视频监控EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

【Echarts示例】类甘特图的时间线图表

[示例] 类甘特图的时间线图表 const data [{ name: 预备阶段, start: 0, end: 2 },{ name: 战略展开, start: 2, end: 4 },{ name: 指挥所启动, start: 4, end: 6 },{ name: 电子对抗准备, start: 5.5, end: 7 },{ name: 首轮导弹发射, start: 7, end: 8.5 },{ name: 电子对抗…

Spark内核的设计原理

导读&#xff1a; 本期是DataFun深入浅出Apache Spark第一期的分享&#xff0c;主讲老师耿嘉安开场介绍了自己的从业经历&#xff0c;当前就职的数新网络与Spark相关的两款产品赛博数智引擎CyberEngine和赛博数据智能平台CyberData。 本次分享题目为《Spark内核的设计原理》&…

【测开能力提升-fastapi框架】fastapi能力提升 - 中间件与CORS

1. 中间件 1.1 介绍&#xff08;ChatGPT抄的&#xff0c;大致可以理解&#xff09; 一种机制&#xff0c;用于在处理请求和响应之前对其进行拦截、处理或修改。中间件可以在应用程序的请求处理管道中插入自定义逻辑&#xff0c;以实现一些通用的功能&#xff0c;如身份验证、…