高通 display 驅動【轉】

来源:https://www.cnblogs.com/linhaostudy/archive/2018/05/14/9036365.html
-Advertisement-
Play Games

"高通display驅動" 0. 關鍵字 MDSS : 高通平臺lcd multimedia Display sub system DSI: Display Serial Interface 1. 涉及文件 1. drivers\video\fbmem.c(核心層) 2. drivers\video ...


高通display驅動

0. 關鍵字

MDSS : 高通平臺lcd multimedia Display sub system
DSI: Display Serial Interface

qcom,mdss-dsi-force-clock-lane-hs;          // faulse :clock每幀回lp11   ture: clock不回
qcom,mdss-dsi-hfp-power-mode;               // data 每行回lp11,對應的hfp要修改成300以上

1. 涉及文件

  1. drivers\video\fbmem.c(核心層)

    register_framebuffer(struct fb_info *fb_info)   //對外暴露核心函數
  2. drivers\video\msm\mdss\mdss_fb.c (mdss 核心層 fbx平臺設備驅動)

    // 調用 fbmem.c的 register_framebuffer註冊 fbx
  3. msm8909-mdss.dtsi(文件名通常為msm8909-mdss.dtsi指定了mdss的mdp和dsi)

    mdss_mdp: qcom,mdss_mdp@fd900000 {
            compatible = "qcom,mdss_mdp3";  // 對應mdss驅動 mdss_mdp.
    mdss_dsi0: qcom,mdss_dsi@fdd00000 {
        compatible = "qcom,msm-dsi-v2";      // 對應dsi解析驅動 dsi_host_v2.c
  4. drivers\video\msm\mdss\dsi_host_v2.c (lcd驅動 dsi)
    // 通過下麵函數向 mdss_fb.c 註冊了fb_info結構 (包含在mdss_dsi_ctrl_pdata結構中) dsi_panel_device_register_v2(struct platform_device *dev,struct mdss_dsi_ctrl_pdata *ctrl_pdata) static const struct of_device_id msm_dsi_v2_dt_match[] = { {.compatible = "qcom,msm-dsi-v2"}, {} };
    或者
    drivers\video\msm\mdss\mdss_dsi.c

  5. drivers\video\msm\mdss\mdp3.c (mdp)

       .compatible = "qcom,mdss_mdp3",
  6. arch/arm/boot/dts/qcom/msm8909-qrd-skua.dtsi
    通常在dts文件的 mdss_dsi0 lab裡面通過qcom,dsi-pref-prim-pan 屬性 指定使用哪一個lcd配置

    &mdss_dsi0 {
    qcom,dsi-pref-prim-pan = <&dsi_hx8379a_fwvga_skua_vid>;
    pinctrl-names = "mdss_default", "mdss_sleep";
    pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
    pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
    qcom,platform-reset-gpio = <&msm_gpio 25 0>;
    };
  7. dsi-panel-fl10802-fwvga-video.dtsi

    &mdss_mdp {
    dsi_fl10802_fwvga_vid: qcom,mdss_dsi_fl10802_fwvga_video {
        qcom,mdss-dsi-panel-name = "fl10802 fwvga video mode dsi panel";
        qcom,mdss-dsi-drive-ic = "fl10802";
        qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
        qcom,mdss-dsi-panel-type = "dsi_video_mode";
        qcom,mdss-dsi-panel-destination = "display_1";
        ...
        }

    2. mdss_mdp 和 mdss_dsi0 的關係

    mdss_mdp 相當於一個數組,裡面定義了很多不同lcd顯示屏的配置項包括解析度等等
    image
    ---
    mdss_dsi0 的 “qcom,dsi-pref-prim-pan ” 屬性指定了使用mdss_mdp中哪一個lcd配置選項
    image

3.時序圖

image

4. 重要結構

4.1 結構關係

image

backLight
關鍵字:qcom,mdss-dsi-bl-pmic-control-type
struct mdss_dsi_ctrl_pdata {
    int ndx;    /* panel_num */
    int (*on) (struct mdss_panel_data *pdata);                              // ★ on
    int (*off) (struct mdss_panel_data *pdata);                             // ★ off
    int (*partial_update_fnc) (struct mdss_panel_data *pdata);
    int (*check_status) (struct mdss_dsi_ctrl_pdata *pdata);
    int (*cmdlist_commit)(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp);
    void (*switch_mode) (struct mdss_panel_data *pdata, int mode);
    struct mdss_panel_data panel_data;                          //★  panel_data.set_backlight   設置背光亮度函數
                                                                //★  panel_data.panel_info    = struct mdss_panel_info ①
    unsigned char *ctrl_base;
    struct dss_io_data ctrl_io;
    struct dss_io_data mmss_misc_io;
    struct dss_io_data phy_io;
    int reg_size;
    u32 bus_clk_cnt;
    u32 link_clk_cnt;
    u32 flags;
    struct clk *mdp_core_clk;
    struct clk *ahb_clk;
    struct clk *axi_clk;
    struct clk *mmss_misc_ahb_clk;
    struct clk *byte_clk;
    struct clk *esc_clk;
    struct clk *pixel_clk;
    u8 ctrl_state;
    int panel_mode; 
    int irq_cnt;
    int rst_gpio;                   // ★ gpio  qcom,platform-reset-gpio:        Specifies the panel reset gpio.
    int disp_en_gpio;               // qcom,platform-enable-gpio:               Specifies the panel lcd/display enable gpio.
    int disp_te_gpio;               // qcom,platform-te-gpio:                   Specifies the gpio used for TE.
    int mode_gpio;                  // qcom,platform-mode-gpio:             Select video/command mode of panel through gpio when it supports both modes.
    int disp_te_gpio_requested;
    int bklt_ctrl;                  /* backlight ctrl 背光類型*/   
    int pwm_period;
    int pwm_pmic_gpio;
    int pwm_lpg_chan;
    int bklt_max;
    int new_fps;
    int pwm_enabled;
    bool dmap_iommu_map;
    struct pwm_device *pwm_bl;
    struct dsi_drv_cm_data shared_pdata;
    u32 pclk_rate;
    u32 byte_clk_rate;
    struct dss_module_power power_data;     // ★ clock & regulator
    u32 dsi_irq_mask;
    struct mdss_hw *dsi_hw;
    struct mdss_panel_recovery *recovery;

    struct dsi_panel_cmds on_cmds;          // light on cmd  ★    qcom,mdss-dsi-on-command

    struct dsi_panel_cmds off_cmds;         // off cmd      ★    qcom,mdss-dsi-off-command
    struct dsi_panel_cmds status_cmds;
    u32 status_value;

    struct dsi_panel_cmds video2cmd;
    struct dsi_panel_cmds cmd2video;

    struct dcs_cmd_list cmdlist;
    struct completion dma_comp;
    struct completion mdp_comp;
    struct completion video_comp;
    struct completion bta_comp;
    spinlock_t irq_lock;
    spinlock_t mdp_lock;
    int mdp_busy;
    struct mutex mutex;
    struct mutex cmd_mutex;

    bool ulps;

    struct dsi_buf tx_buf;
    struct dsi_buf rx_buf;
    struct dsi_buf status_buf;
    int status_mode;
};

struct mdss_panel_info結構體

struct mdss_panel_info {
    u32 xres;                   // x 解析度     qcom,mdss-dsi-panel-width
    u32 yres;                   // y 解析度        qcom,mdss-dsi-panel-height
    u32 physical_width;         // x 物理大小   qcom,mdss-pan-physical-width-dimension
    u32 physical_height;        // y 物理大小   qcom,mdss-pan-physical-height-dimension
    struct lcd_panel_info lcdc; // 邊界       (1.1)邊界
    u32 bpp;                    // bpp          qcom,mdss-dsi-bpp
    struct mipi_panel_info mipi; // mipi顯示模式 video or cmd  (1.2)mipi

    u32 type;
    u32 wait_cycle;
    u32 pdest;                 // 第幾個fb設備  qcom,mdss-dsi-panel-destination = "display_1";
    u32 brightness_max;
    u32 bl_max;
    u32 bl_min;
    u32 fb_num;
    u32 clk_rate;
    u32 clk_min;
    u32 clk_max;
    u32 frame_count;
    u32 is_3d_panel;
    u32 out_format;
    u32 rst_seq[MDSS_DSI_RST_SEQ_LEN];
    ...
}

(1.1)邊界

struct lcd_panel_info {
    u32 h_back_porch;
    u32 h_front_porch;
    u32 h_pulse_width;
    u32 v_back_porch;
    u32 v_front_porch;
    u32 v_pulse_width;
    u32 border_clr;
    u32 underflow_clr;
    u32 hsync_skew;
    /* Pad width */
    u32 xres_pad;       // qcom,mdss-dsi-h-left-border
    /* Pad height */
    u32 yres_pad;       // qcom,mdss-dsi-h-right-border
};

(1.2)mipi

struct mipi_panel_info {
    char mode;      /* video/cmd */   // 顯示模式   qcom,mdss-dsi-panel-type = "dsi_video_mode";
    char interleave_mode;
    char crc_check;
    char ecc_check;
    char dst_format;    /* shared by video and command */
    char data_lane0;
    char data_lane1;
    char data_lane2;
    char data_lane3;
    char dlane_swap;    /* data lane swap */
    char rgb_swap;
    char b_sel;
    char g_sel;
    char r_sel;
    char rx_eot_ignore;
    char tx_eot_append;
    char t_clk_post; /* 0xc0, DSI_CLKOUT_TIMING_CTRL */
    char t_clk_pre;  /* 0xc0, DSI_CLKOUT_TIMING_CTRL */
    char vc;    /* virtual channel */
    struct mdss_dsi_phy_ctrl dsi_phy_db;
    /* video mode */
    char pulse_mode_hsa_he;
    char hfp_power_stop;
    char hbp_power_stop;
    char hsa_power_stop;
    char eof_bllp_power_stop;
    char last_line_interleave_en;
    char bllp_power_stop;
    char traffic_mode;
    char frame_rate;
    /* command mode */
    char interleave_max;
    char insert_dcs_cmd;
    char wr_mem_continue;
    char wr_mem_start;
    char te_sel;
    char stream;    /* 0 or 1 */
    char mdp_trigger;
    char dma_trigger;
    /*Dynamic Switch Support*/
    bool dynamic_switch_enabled;
    u32 pixel_packing;
    u32 dsi_pclk_rate;
    /* The packet-size should not bet changed */
    char no_max_pkt_size;
    /* Clock required during LP commands */
    char force_clk_lane_hs;   //強制DSI_CLK始終處於HS,因我們用DSI CLK as 參考時鐘

    char vsync_enable;
    char hw_vsync_mode;

    char lp11_init;
    u32  init_delay;
};

5.結構賦值

//結構從設備數中獲取數據賦值     mdss_dsi_panel.c
int mdss_dsi_panel_init(struct device_node *node,struct mdss_dsi_ctrl_pdata *ctrl_pdata,    int ndx)
// use
Dsi_host_v2.c (drivers\video\msm\mdss): 
rc = mdss_dsi_panel_init(dsi_pan_node, ctrl_pdata, cmd_cfg_cont_splash);
Mdss_dsi.c (drivers\video\msm\mdss):            
rc = mdss_dsi_panel_init(dsi_pan_node, ctrl_pdata, ndx);

6.lk中傳遞lcm使用的dsi配置名字給kernel

aboot_init                           // lk\app\aboot\aboot.c
    target_display_init         // lk\target\msm8953\target_display.c
        gcdb_display_init        // lk\dev\gcdb\display\gcdb_display.c
            msm_display_init  // display.c
                display_image_on_screen   //


aboot_init                           // lk\app\aboot\aboot.c
    target_display_init         // lk\target\msm8953\target_display.c
        gcdb_display_init        // lk\dev\gcdb\display\gcdb_display.c
            oem_panel_select   // lk\target\msm8953\oem_panel.c

            panel_id = NT51021B_INX_WUXGA_VIDEO_PANEL;    // ☆ panel_id 賦值,使用哪個lcd配置

                init_panel_data     

                    switch (panel_id) {
                            case NT51021B_INX_WUXGA_VIDEO_PANEL:
                                panelstruct->paneldata    = &nt51021b_inx_wuxga_video_panel_data;   // 根據 panel_id 指定傳給kernel使用的lcm配置


----------
// lk\dev\gcdb\display\include\panel_nt51021b_inx_wuxga_video.h  (lcm配置文件)

static struct panel_config nt51021b_inx_wuxga_video_panel_data = {
  "qcom,mdss_dsi_nt51021b_inx_wuxga_video",    // ☆ panel_node_id 對應dtsi中 panel使用的名字 
  "dsi:0:", "qcom,mdss-dsi-panel",
  10, 0, "DISPLAY_1", 0, 0, 60, 0, 0, 0, 1, 10000, 0, 0, 0, 0, 0, 0, NULL
};                                
----------
// arch\arm64\boot\dts\qcom\dsi-panel-nt51021b-inx-wuxga-video.dtsi
&mdss_mdp {
    dsi_nt51021b_inx_wuxga_vid: qcom,mdss_dsi_nt51021b_inx_wuxga_video {//dts中的 panel名字
        qcom,mdss-dsi-panel-name = "nt51021b inx wuxga video mode dsi panel";  /

6.1 dts中command格式解析

qcom,mdss-dsi-on-command = [
         //            延時      reg data              
            29 01 00 00 01 00 02 8F A5
            29 01 00 00 14 00 02 01 00
            29 01 00 00 01 00 02 8F A5
            29 01 00 00 00 00 02 8C 80
            29 01 00 00 00 00 02 C7 50
            29 01 00 00 00 00 02 C5 50
            29 01 00 00 00 00 02 85 04
            29 01 00 00 00 00 02 86 08
            29 01 00 00 00 00 02 83 AA
            29 01 00 00 00 00 02 84 11
            29 01 00 00 00 00 02 A0 36
            29 01 00 00 00 00 02 A1 36
            29 01 00 00 00 00 02 9C 10
            29 01 00 00 00 00 02 A9 4B
            29 01 00 00 00 00 02 8F 00];

7. fb旋轉參數配置

7.1 方法1

fb_info->var->rotate                             // 是否旋轉

7.2 方法2

msm_fb_data_type->panel_orientation                  //是否旋轉fb   (mdss_fb.h)

// 通過dsi中的 qcom,mdss-dsi-panel-orientation 關鍵字控制  (mdss_dsi_panel.c)
data = of_get_property(np, "qcom,mdss-dsi-panel-orientation", NULL);
    if (data) {
        pr_debug("panel orientation is %s\n", data);
        if (!strcmp(data, "180"))
            pinfo->panel_orientation = MDP_ROT_180;
        else if (!strcmp(data, "hflip"))
            pinfo->panel_orientation = MDP_FLIP_LR;
        else if (!strcmp(data, "vflip"))
            pinfo->panel_orientation = MDP_FLIP_UD;
    }

7.3 方法三

system/build.prop

8.展頻

mdss-pll.c
    展頻開關:
    arch/arm/boot/dts/qcom/msm8953-mdss-pll.dtsi   qcom,dsi-pll-ssc-en;
    mode:
    qcom,dsi-pll-ssc-mode = "down-spread";

    two parameters to program SSC :

    clk/msm/mdss/mdss-dsi-pll-8996.c:ssc_ppm_default & ssc_freq_default

    展頻範圍:

    down mode : freq - freq * (ssc_ppm/1000,000)

    center mode : freq ± freq * (ssc_ppm/1000,000) / 2

    up mode : freq + freq * (ssc_ppm/1000,000)

9. bklt_en_gpio、 disp_en_gpio、 rst_gpio相關gpio口

// (msm8917-pmi8937-qrd-sku5.dtsi  board.dtsi )   mdss_dsi_active   mdss_dsi_suspend  qcom,platform-reset-gpio  qcom,platform-enable-gpio
&mdss_dsi0 {  
    qcom,dsi-pref-prim-pan = <&dsi_hx8394f_720p_video>;
    pinctrl-names = "mdss_default", "mdss_sleep";
    pinctrl-0 = <&mdss_dsi_active>;
    pinctrl-1 = <&mdss_dsi_suspend>;

    qcom,platform-reset-gpio = <&tlmm 60 0>;      // rst
    qcom,platform-enable-gpio= <&tlmm 46 0>;    //供電引腳
};



     //(mdss_dsi.c)   disp_en_gpio bklt_en_gpio rst_gpio
    // mdss_dsi_parse_gpio_params 
    ctrl_pdata->disp_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-enable-gpio", 0);
    ctrl_pdata->disp_te_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-te-gpio", 0);
    ctrl_pdata->bklt_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-bklight-en-gpio", 0);
    ctrl_pdata->rst_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-reset-gpio", 0);
    ctrl_pdata->mode_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-mode-gpio", 0);
    
    // mdss_dsi_panel_power_on
    mdss_dsi_panel_reset(pdata, 1);   // (mdss_dsi_panel.c)
    gpio_set_value((ctrl_pdata->bklt_en_gpio), 0);
    gpio_set_value((ctrl_pdata->disp_en_gpio), 0);
    gpio_set_value((ctrl_pdata->rst_gpio), 0);


    // mdss_dsi_panel_power_off
    mdss_dsi_panel_reset(pdata, 0); // (mdss_dsi_panel.c)
    gpio_set_value((ctrl_pdata->bklt_en_gpio), 0);
    gpio_set_value((ctrl_pdata->disp_en_gpio), 0);
    gpio_set_value((ctrl_pdata->rst_gpio), 0);
// (msm8917-pinctrl.dtsi)

pmx_mdss: pmx_mdss {
    mdss_dsi_active: mdss_dsi_active {
        mux {
        pins = "gpio60", "gpio46";
        function = "gpio";
        };
        
        config {
        pins = "gpio60", "gpio46";
        drive-strength = <8>; /* 8 mA */
        bias-disable = <0>; /* no pull */
        //                  output-high;
        };
    };
    mdss_dsi_suspend: mdss_dsi_suspend {
        mux {
            pins = "gpio60", "gpio46";
            function = "gpio";
        };

        config {
            pins = "gpio60", "gpio46";
            drive-strength = <2>; /* 2 mA */
            bias-pull-down; /* pull down */
        };
    };

10. esd功能

qcom,esd-check-enabled                      // 是否使用esd check 功能
qcom,mdss-dsi-panel-status-check-mode       // esd check的方式 te_signal_check (只能在cmd模式下用)or reg_read

10.1 cmd mode demo

qcom,mdss-dsi-te-pin-select = <1>;
        qcom,mdss-dsi-te-v-sync-rd-ptr-irq-line = <0x2c>;
        qcom,mdss-dsi-te-v-sync-continue-lines = <0x3c>;
        qcom,mdss-dsi-te-dcs-command = <1>;
        qcom,esd-check-enabled;                                         // enable esd check
        qcom,mdss-dsi-panel-status-check-mode = "te_signal_check";              // esd check mode   te模式 (只能用作cmd模式)
        qcom,mdss-dsi-te-check-enable;                                      // te
        qcom,mdss-dsi-te-using-te-pin;                                      // use te pin   

10.2 video mode demo

qcom,esd-check-enabled;
        qcom,mdss-dsi-panel-status-check-mode = "reg_read";
        qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08];
        qcom,mdss-dsi-panel-status-command-state = "dsi_lp_mode";
        qcom,mdss-dsi-panel-status-read-length = <1>;
        qcom,mdss-dsi-panel-max-error-count = <2>;
        qcom,mdss-dsi-panel-status-value = <0x9c>;

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近期想對自己的項目增加自動編譯並生成nuget包,網上資料不少。但總還有迷糊的時候。首先:此解決方案包含多種版本的項目,如:有編譯必須是x86平臺,以及還有傳統的.net foramework項目,以及多版本的.net core項目等。找到通用的解決方案還是用了不少的時間。本文章就對此做下自我總結。... ...
  • 1. NetCore ZKweb 在我第一次繪製圖形驗證碼時是採用的ZKweb的繪製庫,奉上代碼參考 這個開始用的還不錯,但是今天更新了VS到15.7版這個就產生了一個很噁心的問題,ZKweb的引用庫和項目自帶的Core.All好幾個dll衝突,這兩個一個是ZKweb的依賴庫一個是項目的依賴庫 都沒 ...
  • 新的業務來了,需要使用linux環境部署web服務,作為一個C#的懶惰程式員,就這麼上了車【狗臉】,廢話不多說,跟我一樣的小白請看,大神請繞路。 站點暫時沒有使用Docker部署,為什麼呢,因為我還沒搞清楚哇,攤手~ 目標 VS2017+Core2.0+bootstrap+vue+ubuntu14. ...
  • 轉載自 https://blog.csdn.net/oldmtn/article/details/52208747 【oldmtn】 1. 基本原理 參考:http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html == Begin  ...
  • 1、C#中LINQ to Objects中延遲查詢的陷阱(其他類型的LINQ也基本一致) 之前在不瞭解LINQ延遲查詢的時候,我使用下麵的這種方式,將where語句的結果直接as為List<T>對象,結果得到的temp為NULL,苦思不得其解; 求解思路: 一開始以為是LINQ語句的問題,但是在反覆 ...
  • system.webServer節點下加上 <validation validateIntegratedModeConfiguration="false" /> ...
  • 這是由於當前用戶沒有許可權運行/usr/bin/dumpcap造成的。/usr/bin/dumpcap是Wireshark的包捕獲引擎。先用ls命令看一下dumpcap的許可權情況:xy@debian-vm-1:~$ ls -lah /usr/bin/dumpcap-rwxr-xr-- 1 root w ...
  • Centos 系統安裝 Centos 系統部署Nginx ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...