<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      痞子衡嵌入式:超級(jí)下載算法(RT-UFL)開(kāi)發(fā)筆記(2) - 識(shí)別當(dāng)前i.MXRT型號(hào)


        大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是超級(jí)下載算法開(kāi)發(fā)筆記(2)之識(shí)別當(dāng)前i.MXRT型號(hào)

        文接上篇 《超級(jí)下載算法(RT-UFL)開(kāi)發(fā)筆記(1) - 執(zhí)行在不同CM內(nèi)核下》,我們已經(jīng)解決了超級(jí)下載算法能夠在i.MXRT全系列下執(zhí)行的問(wèn)題,現(xiàn)在我們往前繼續(xù)推進(jìn)項(xiàng)目。因?yàn)檫@個(gè)超級(jí)下載算法將來(lái)要跑在很多個(gè)芯片型號(hào)上,有時(shí)候因?yàn)樾吞?hào)間差異,我們不得不針對(duì)性地弄出不同代碼處理分支,而這一切的前提是我們能動(dòng)態(tài)地獲取當(dāng)前芯片型號(hào)。

        本篇是開(kāi)發(fā)筆記第二篇,咱們就重點(diǎn)聊聊如何讓超級(jí)下載算法知道當(dāng)前跑在哪個(gè)i.MXRT型號(hào)下。

      一、尋找i.MXRT家族的ID信息

        恩智浦當(dāng)前MCU產(chǎn)品線眾多,i.MXRT是2018年才開(kāi)始推出的新系列,在這之前恩智浦主推的MCU是經(jīng)典的Kinetis和LPC系列,痞子衡對(duì)這兩個(gè)系列產(chǎn)品也非常熟,型號(hào)信息在Kinetis和LPC上都有展現(xiàn)。

      1.1 回顧Kinetis和LPC

        Kinetis系列有一個(gè)專門存放型號(hào)信息的寄存器即SIM->SDID,這個(gè)寄存器設(shè)計(jì)得非常經(jīng)典,其FAMILYID + SUBFAMID + SERIESID區(qū)域組合將Kinetis系列的家族分類特性展示得淋漓盡致。

        LPC系列存放型號(hào)信息的寄存器是SYSCON->DEVICE_ID0,這個(gè)寄存器是另外一種設(shè)計(jì)風(fēng)格,低20bit直接就是LPC系列號(hào)的值,比如LPC54114xxx型號(hào)其SYSCON->DEVICE_ID0[19:0] = 0x54114,是不是簡(jiǎn)單粗暴。

      1.2 查找i.MXRT的ID寄存器

        我們知道i.MXRT從架構(gòu)上分為四位數(shù)和三位數(shù)兩大陣營(yíng),四位數(shù)源自i.MX應(yīng)用處理器,三位數(shù)源自LPC系列,我們分別來(lái)看。

        翻看i.MXRT四位數(shù)典型型號(hào)i.MXRT1060的參考手冊(cè),并沒(méi)有找到任何有關(guān)型號(hào)信息的寄存器,僅有UID寄存器,但UID跟芯片型號(hào)無(wú)關(guān)。四位數(shù)上找不到型號(hào)信息寄存器,也跟其源于i.MX有關(guān),畢竟MPU不像MCU那樣會(huì)細(xì)分特別多的型號(hào)。

        再看i.MXRT三位數(shù)典型型號(hào)i.MXRT600的參考手冊(cè),我們找到了型號(hào)信息,在SYSCTL0->PRODUCT_ID寄存器中,細(xì)看其寄存器設(shè)計(jì),還是能看出LPC的影子的,SYSCTL0->PRODUCT_ID[15:4]直接就是系列號(hào)的值。

      二、確認(rèn)i.MXRT型號(hào)的替代方法

        根據(jù)上一節(jié)的分析,我們幾乎不能用傳統(tǒng)Kinetis或LPC上型號(hào)信息寄存器那一套方式來(lái)統(tǒng)一獲取i.MXRT型號(hào),那有沒(méi)有替代方法呢?答案當(dāng)然是有。靈感來(lái)自于痞子衡之前研究i.MXRT的ROM API時(shí)寫過(guò)的一篇文章 《了解i.MXRTxxx系列ROM API及其與i.MXRT1xxx系列的差異》,i.MXRT系列全部都有BootROM,每個(gè)型號(hào)的ROM區(qū)域內(nèi)容并不盡然相同,我們可以通過(guò)讀幾個(gè)ROM區(qū)域不同位置的值來(lái)定位型號(hào)。

      2.1 讀SCB->CPUID得到內(nèi)核版本

        i.MXRT四位數(shù)(都是CM7內(nèi)核)的ROM基址是0x200000,而i.MXRT三位數(shù)(都是CM33內(nèi)核)的ROM基址是0x3000000,基址是有差異的,所以我們首先需要先找出一種方法來(lái)區(qū)分基址,這里可以借助ARM Cortex-M內(nèi)核模塊SCB里的CPUID寄存器。

        翻看ARM Cortex-M內(nèi)核的Generic User Guide,可以找到如下CPUID寄存器的定義,其中CPUID[PartNo]中記錄了內(nèi)核版本,CM7的值是0xC27,CM33的值是0xD21。

        我們可以很容易寫出如下ufl_get_core_type()函數(shù)。

      /* See Part number of core in Cortex-Mx Generic UG */
      #define CORE_ID_CM33 (0xD21)
      #define CORE_ID_CM7  (0xC27)
      
      typedef enum _core_type
      {
          kCoreType_Invalid = 0U,
          kCoreType_CM33    = 1U,
          kCoreType_CM7     = 2U,
      } core_type_t;
      
      static core_type_t ufl_get_core_type(void)
      {
          core_type_t coreType = kCoreType_Invalid;
          uint32_t coreid = (SCB->CPUID & SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos;
      
          switch (coreid)
          {
              case CORE_ID_CM33:
                  coreType = kCoreType_CM33;
                  break;
      
              case CORE_ID_CM7:
                  coreType = kCoreType_CM7;
                  break;
      
              default:
                  break;
          }
      
          return coreType;
      }
      
      

      2.2 通過(guò)ROM內(nèi)容定位i.MXRT型號(hào)

        有了ufl_get_core_type()函數(shù),我們便可以進(jìn)一步寫出如下ufl_get_imxrt_chip_id()函數(shù),s_romFingerprint[]結(jié)構(gòu)體數(shù)組預(yù)先存放全部i.MXRT型號(hào)的ROM定位信息(此處僅示例了RT600和RT1060),我們選了ROM偏移0x8000、0xa000、0xc000處的四字節(jié)數(shù)據(jù)來(lái)定位,如后期隨著型號(hào)的增多,出現(xiàn)定位位置處數(shù)據(jù)全部雷同的巧合的話,可以更改定位位置保證定位數(shù)據(jù)一定不相同。

      typedef enum _rt_chip_id
      {
          kChipId_Invalid = 0xFFU,
          kChipId_RT6xx   = 1U,
          kChipId_RT106x  = 2U,
      } rt_chip_id_t;
      
      #define RT_ROM_BASE_CM33 (0x03000000u)
      #define RT_ROM_BASE_CM7  (0x00200000u)
      
      #define ROM_FP_OFFSET1 (0x8000)
      #define ROM_FP_OFFSET2 (0xa000)
      #define ROM_FP_OFFSET3 (0xc000)
      
      typedef struct _rom_fingerprint
      {
          uint32_t chipId;
          uint32_t content[3];
      } rom_fingerprint_t;
      
      static const rom_fingerprint_t s_romFingerprint[] = {
          {kChipId_RT6xx,  {0xb108f82a, 0x0200f2c5, 0x0070f104} },        // From ROM 2.0rc5.1
          {kChipId_RT106x, {0xb0893000, 0x80dbf000, 0xf2c44100} },        // From ROM 1.0rc3
      };
      
      rt_chip_id_t ufl_get_imxrt_chip_id(void)
      {
          rt_chip_id_t chipId = kChipId_Invalid;
          core_type_t coreType;
          uint32_t rtRomBase = 0;
      
          coreType = ufl_get_core_type();
          if (kCoreType_CM33 == coreType)
          {
              rtRomBase = RT_ROM_BASE_CM33;
          }
          else if (kCoreType_CM7 == coreType)
          {
              rtRomBase = RT_ROM_BASE_CM7;
          }
          else
          {}
      
          do
          {
              uint32_t content[3];
              content[0] = *(uint32_t *)(rtRomBase + ROM_FP_OFFSET1);
              content[1] = *(uint32_t *)(rtRomBase + ROM_FP_OFFSET2);
              content[2] = *(uint32_t *)(rtRomBase + ROM_FP_OFFSET3);
      
              uint32_t idx = sizeof(s_romFingerprint) / sizeof(rom_fingerprint_t);
              while (idx--)
              {
                  if (!memcmp(s_romFingerprint[idx].content, content, sizeof(content)))
                  {
                      chipId = (rt_chip_id_t)s_romFingerprint[idx].chipId;
                      break;
                  }
              }
          } while (0);
      
          return chipId;
      }
      
      

        至此,超級(jí)下載算法開(kāi)發(fā)筆記(2)之識(shí)別當(dāng)前i.MXRT型號(hào)痞子衡便介紹完畢了,掌聲在哪里~~~

      歡迎訂閱

      文章會(huì)同時(shí)發(fā)布到我的 博客園主頁(yè)CSDN主頁(yè)知乎主頁(yè)微信公眾號(hào) 平臺(tái)上。

      微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機(jī)上第一時(shí)間看了哦。

      posted @ 2020-11-13 22:48  痞子衡  閱讀(842)  評(píng)論(1)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产精品无码久久久久| 日韩AV片无码一区二区不卡| 阿荣旗| 欧美成人h精品网站| 夜色福利站WWW国产在线视频| 久国产精品韩国三级视频| 成人免费ā片在线观看| 亚洲成年av天堂动漫网站| 久久精品女人的天堂av| 精品久久8x国产免费观看| 亚洲区欧美区综合区自拍区| 亚洲综合网国产精品一区| 又大又紧又粉嫩18p少妇| 天堂网av最新版在线看| 国产不卡一区二区四区| 涿鹿县| 国产一区二区日韩在线| 国产青榴视频在线观看| 精品国产午夜福利在线观看 | 亚洲av成人一区在线| 免费人妻无码不卡中文18禁| 日本国产精品第一页久久| 亚洲av成人无网码天堂| 精品人妻av区乱码| 日韩少妇人妻vs中文字幕| 一区二区偷拍美女撒尿视频 | 亚洲av伊人久久综合性色| 国产精品中文字幕日韩| 午夜福利高清在线观看| 亚洲国产成人自拍视频网| 亚洲加勒比久久88色综合| a级亚洲片精品久久久久久久| www亚洲精品| 国产精品女视频一区二区| 日韩美a一级毛片| 亚洲超碰97无码中文字幕| 中国老太婆video| 大桥未久亚洲无av码在线| 精品亚洲香蕉久久综合网| 亚洲欧洲精品一区二区| 成人拍拍拍无遮挡免费视频|