<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>[16 x 5 = ? ] 날자~~ 까마귀75</title>
    <link>https://devdockr.tistory.com/</link>
    <description>Boost C++ Libraries, Modern C++, Embedded Linux 등... 
소프트웨어와 관련된 기술 문서 번역이나, 개발 환경 구축 등의 내용을 블로그 합니다.    


</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 13:42:09 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>까마귀75</managingEditor>
    <image>
      <title>[16 x 5 = ? ] 날자~~ 까마귀75</title>
      <url>https://tistory1.daumcdn.net/tistory/4362795/attach/aaa1bd05dd9f488a8a20009221cb394e</url>
      <link>https://devdockr.tistory.com</link>
    </image>
    <item>
      <title>TinyML 낙서장</title>
      <link>https://devdockr.tistory.com/2382</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TinyML 정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TinyML은 에너지 비용이 1mW 미만인 하드웨어 플랫폼으로 정의할 수 있다. 즉 TinyML을 이해하려면 임베디드 장치를 이해해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TinyML 적용가능 하드웨어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a title=&quot;판매처&quot; href=&quot;https://www.devicemart.co.kr/goods/view?no=11869982&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;스파크펀 에지&lt;/a&gt;, 스파크펀 에지2&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;판매처&quot; href=&quot;https://www.devicemart.co.kr/goods/view?no=10919318&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Arduino NANO 33 BLE Sense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;판매처&quot; href=&quot;https://www.devicemart.co.kr/goods/view?no=1377199&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;STM32F746G Discovery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;머신러닝이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;무언가를 만들기 위해 모든 이론을 꼭 알아야 하는 것은 아니다. 결국 머신 러닝은 시행 착오가 전부이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝 알고리즘은 훈련(training)이라는 과정을 통해 알고리즘에 제공한 데이터를 기반으로 시스템의 모델(model)을 구축한다. 모델은 프로그램의 한 유형이다. 모델이 완성되면 여기에 새로운 데이터를 공급하여 예측을 수행하는데 이 과정을 추론(inference)이라 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝에는 여러 접근 방식이 있다. 딥러닝은 가장 인기 있는 접근 방식이다. 딥러닝은 인간의 뇌가 작동하는 방식에 대한 간단한 개념을 기반으로 한다. 딥러닝에서 시뮬레이션한 뉴런의 네트워크는 다양한 입력과 출력 간의 관계를 모델링하도록 훈련된다. 시물레이션된 뉴런의 배열을 아키텍처(architecture)라 하며 다양한 문제에 특화된 다양한 아키텍처가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝으로 문제를 해결하는 방식은 적절한 목표를 결정하고 적절한 데이터를 수집하고 레이블을 지정하고 모델에 전달할 특징을 설계하고 모델 아키텍처를 결정하는 과정을 반복하는 것이다. 적절한 모델이 나타날 때까지 반복하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;딥러닝 워크플로&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;목표 결정&lt;/b&gt;&lt;br /&gt;수집할 데이터와 사용할 모델 아키텍처를 결정하려면 먼저 예측할 대상을 결정해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터셋 수집&lt;/b&gt;&lt;br /&gt;데이터 선택 : 문제 해결과 관련된 정보만 사용하여 모델을 훈련하는 것이 가장 좋다. 데이터 포함 여부를 결정할 때는 항상 도메인 전문 지식을 실험에 반영해야 한다. 특정 데이터 소스를 포함시킬지 확실하지 않다면 두 가지 모델(특정 데이터를 포함한 것과 안한 것)을 훈련시키고 그중 가장 적합한 모델을 선택하는 것도 좋은 방법이다.&lt;br /&gt;데이터 수집 : 효과적인 모델을 훈련시키는 데 데이터가 얼마나 필요한지 정확히 알기는 어렵다(하지만 데이터는 많을 수록 좋다). 발생할 수 있는 모든 조건과 이벤트를 나타내는 데이터를 수집해야 한다. 다양성은 모델이 선택한 몇 가지 시나리오가 아니라 가능한 모든 시나리오를 나타내는 데 도움이 된다.&lt;br /&gt;데이터 레이블링 : 수집한 데이터에 대한 클래스를 결정해야 한다. 데이터를 클래스와 연관시키는 과정을 레이블링(labeling)이라 한다. 모델이 입력을 분류하는 방법을 배울 수 있도록 훈련 과정에서 이 정보를 제공해야 한다. 데이터에 레이블을 지정하는 방법을 결정하면 이를 데이터셋에 추가할 수 있다.&lt;br /&gt;최종 데이터셋&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 아키텍처 설계&lt;/b&gt;&lt;br /&gt;딥러닝 모델 아키텍처는 다양한 종류가 있으며 현존하는 아키텍처는 넓은 범위의 문제를 해결할 수 있다. 모델을 훈련할 때 고유한 아키텍처로 설계할 수도 있고 기존에 개발한 아키텍처를 기반으로 모델을 선택할 수 있다.&lt;br /&gt;아키텍처를 결정할 때는 해결하려는 문제의 유형, 접근할 수 있는 데이터 유형, 데이터를 모델에 공급하기 전에 해당 데이터를 변환할 수 있는 방법을 고려해야 한다.&lt;br /&gt;모델을 실행할 장치의 제약 조건도 고려해야 한다(마이크로 컨트롤러는 메모리가 제한적이고 프로세서 속도가 느리다).&lt;br /&gt;TinyML에는 몇 개의 뉴련 층으로 간단한 모델을 훈련한 다음 유용한 결과를 얻을 때가지 반복적인 프로세스로 아키텍처를 개선하는 방법을 적용할 수 있다.&lt;br /&gt;딥러닝 모델은 텐서 형태로 입력을 받고 출력을 생성한다.&lt;br /&gt;벡터 : 배열과 비슷한 숫자 목록&lt;br /&gt;행렬 : 2D 배열과 유사한 2D 텐서&lt;br /&gt;고차원 텐서 : 3D 이상의 모든 형태 (그냥 텐서라고 불림)&lt;br /&gt;스칼라 : 하나의 숫자 (0D 텐서)&lt;br /&gt;정규화(normalization) : 네트워크에 전달하려는 값이 모두 비슷한 범위에 있도록 하는 작업 (0에 가까워지도록 축소)&lt;br /&gt;일반화(regularization) : 딥러인 모델이 과적합에 빠질 가능성을 줄이기 위해 사용하는 기법 (훈련 중에 제공되는 데이터를 완벽하게 기억하지 못하도록 모델을 제한)&lt;br /&gt;데이터 증식 : 훈련 데이터셋의 크기를 인위적으로 확장하는 방법 (훈련 데이터 전체에 일부 변형을 가한 여러 추가 버전을 만드는 과정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 훈련&lt;/b&gt;&lt;br /&gt;훈련은 모델이 주어진 입력 세트로 올바른 출력을 생성하는 방법을 배우는 과정이다. 트레이닝 데이터를 모델에 제공하여 가장 정확한 예측이 가능해질 때까지 조금식 조정하는 과정이다.&lt;br /&gt;모델이란 시뮬레이션된 뉴런의 네트워크이다. 여러 레이어의 숫자 배열로 표현된다(이들 숫자를 가중치, 편향 또는 네트워크 파라미터라고 함).&lt;br /&gt;모델 출력의 결과는 데이터를 네트워크에 공급하여 레이어의 가중치와 편향을 포함하는 연속적인 수학적 연산에 의해 변환된 값이다.&lt;br /&gt;모델이 정확한 예측을 하기 시작한 시점부터는 모델이 수렴했다고 표현한다. 모델이 수렴됐는지 확인하는 일반적인 성능 지표는 손실과 정확도이다.&amp;nbsp;&lt;br /&gt;모델 성능을 개선하기 위해 모델의 아키텍처를 변경하고 훈련 과정을 조정하는 데 사용하는 다양한 값을 하이퍼파라미터라고 한다.&lt;br /&gt;해결하려는 문제에 대해 충분한 정확도를 달성할 수 있다는 보장은 없으며, 100% 정확하지 않더라도 유용할 수 있다.&lt;br /&gt;모델이 수렴하지 못하는 가정 일반적인 이유는 과적합과 과소적합 때문이다. 모델이 적합하면 주어진 입력 세트에 대해 올바른 출력을 생성한다.&lt;br /&gt;과소적합이란 충분한 패턴을 학습하지 못하여 좋은 예측을 할 수 없는 상태를 의미한다(일반적으로 아키텍처가 너무 작아 모델링해야 하는 시스템의 복잡성을 포착하기에 충분하지 않거나 충분한 데이터로 학습을 못했기 때문이다).&lt;br /&gt;과적합이한 훈련 데이터를 너무 잘 배웠다는 의미이다(훈련 데이터에 대해서는 정확한 출력을 예측할 수 있지만 처음 보는 데이터까지 예측할 수 있는 일반화된 모델로 작동할 수 없다).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 변환&lt;/b&gt;&lt;br /&gt;텐서플로 모델은 출력을 생성하기 위해 인터프리터에 데이터를 변환하는 방법을 알려주는 일련의 명령어이다. 모델을 메모리에 로드하고 텐서플로 인터프리터를 사용하여 실행하면 모델을 사용할 수 있다.&lt;br /&gt;텐서플로 인터프리터는 데스크톱 컴퓨터와 서버에서 모델을 실행하도록 설계되어 있다.&lt;br /&gt;텐서플로 라이트는 소형 저전력 장치에서 모델을 실행하기 위한 인터프리터와 도구를 제공한다.&lt;br /&gt;텐서플로 라이트에서 모델을 실행하려면 모델을 텐서플로 라이트 컨버터를 사용하여 텐서플로 라이트 형식으로 변환한 다음 디스크에 파일로 저장해야 한다. 텐서플로 라이트 컨버터는 모델의 크기를 줄이고 성능 저하 없이 빠르게 실행하기 위한 최적화 기능을 제공한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추론 실행&lt;/b&gt;&lt;br /&gt;마이크로 컨트롤러용 텐서플로 라이트 C++ 라이브러리를 사용하여 모델을 로드하고 예측을 수행한다.&lt;br /&gt;모델이 애플리케이션 코드와 결합하기 때문에 원시 입력 데이터를 훈련 데이터와 동일한 형식으로 변환하는 코드를 작성해야 한다. 그런 다음 변환된 데이터를 모델로 전달하여 추론을 실행한다.&lt;br /&gt;모델은 추론을 통해 예측을 포함하는 출력 데이터를 생성한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;평가 및 문제 해결&lt;/b&gt;&lt;br /&gt;모델을 배포하고 실행한 후 실제 성능이 원하는 결과에 근접하는지 확인할 수 있다. 모델이 테스트 데이터에서 정확하게 예측한다는 사실은 입증했지만 실제 환경에서의 성능은 다를 수 있다.&lt;br /&gt;모델이 실제 환경에서 잘 작동하지 않는다면 문제 해결을 수행해야 한다. 환경적인 문제인지 과적합 문제인지 판단하여 문제를 해결한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모델 구축과 훈련&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;머신러닝 도구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파이썬과 주피터 노트북&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 머신러닝 과학자와 엔지니어가 선호하는 프로그래밍 언어이다. 수학과 관련된 수 많은 라이브러리가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 주피터 노트북과 함께 사용하면 좋다. 주피터 노트북은 클릭 한 번으로 문서 작업, 그래픽, 코드를 함께 실행할 수 있는 특수 문서 형식이다. 주피터 노트북은 머신러닝 코드와 문제를 설명하고 탐색하는 도구로 널리 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구글 코랩&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 코랩은 주피터 노트북을 실행하기 위한 온라인 환경을 제공하며 머신러닝 연구 개발을 장려하는 구글에서 만든 무료 도구이다(일정 부분 무료).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주피터 노트북 환경을 만들어 사용하게 되면, 파이썬 라이브러리와 같은 많은 종속성을 직접 설치하여 사용하므로 다른 버전의 종속성을 갖는 라이브러리가 있을 수 있어 다른 사람과 공유하기 어렵고 예상대로 실행되지 않기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 코랩을 사용하면 구글의 하드웨어에서 무료로 노트북을 실행할 수 있고 다른 사람들과 공유하여 동일한 결과를 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;텐서플로와 케라스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텐서플로는 머신러닝 모델을 구축, 훈련, 평가, 배포하기 위해 구글에서 개발한 오픈소스 프로젝트이며 머신러닝에 가장 널리 사용되는 프레임워크이다. 개발자는 대부분 파이썬 라이브러리 형태로 텐서플로를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;케라스는 딥러닝 네트워크를 쉽게 구축하고 훈련시킬 수 있는 텐서플로의 고급 API이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텐서플로 라이트는 텐서플로 모델을 모바일과 임베디드 장치에 배포하는 도구 세트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;모델 구축과 훈련&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;모델 구축과 훈련&quot;과 관련하여 Colab에서 검증한 노트북의 &lt;a title=&quot;Github&quot; href=&quot;https://github.com/dark-crow/blog_repo/tree/master/TinyML/01_FirstSineModel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Github 링크&lt;/b&gt;&lt;/a&gt;로 대체한다. 해당 링크에서 &quot;&lt;b&gt;first_sine_model.ipynb&lt;/b&gt;&quot; 파일을 참조한다. 책에 나오는 예제를 Colab에서 직접 따라해 보면서 작성한 노트북이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 노트북을 끝가지 진행하면 TensorFlow Lite Converter로 변환한 모델 소스 파일을 얻을 수 있다. 이 파일을 사용하여 마이크로 컨트롤러에서 직접 TensorFlow Lite를 구동할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;애플리케이션 구축&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델은 머신러닝 애플리케이션의 일부일 뿐이다. 모델 자체로는 아무것도 할 수 없는 정보의 덩어리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델을 사용하려면 모델을 실행하는 데 필요한 환경을 설정하고 입력을 제공하고 출력을 사용하여 동작을 생성하는 코드로 모델을 랩핑해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 TinyML 애플리케이션 아키텍처 흐름은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입력 데이터&lt;/li&gt;
&lt;li&gt;전처리 : 모델에 적합하게 입력을 변환&lt;/li&gt;
&lt;li&gt;TensorFlow Lite 인터프리터 : 데이터를 바탕으로 예측하도록 훈련된 신경망 모델을 실행&lt;/li&gt;
&lt;li&gt;후처리 : 모델의 출력을 해석하고 판단&lt;/li&gt;
&lt;li&gt;출력 처리 : 디바이스의 리소스를 사용하여 예측에 따른 반응 수행&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 애플리케이션 코드 작업 전에 테스트를 먼저 작성한다. 테스트를 실행하여 예상대로 작동하는 것을 검증할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드는 hello_world 예제의 테스트 코드이다. 코드 설명은 주석으로 대신한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689743362467&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	아파치 2.0 오픈소스 라이선스 정보이다.
/* Copyright 2019 The TensorFlow Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==============================================================================*/

// #include &quot;tensorflow/lite/c/common.h&quot;
// xxd를 사용하여 C 코드로 변환한 sine 모델
#include &quot;tensorflow/lite/micro/examples/hello_world/sine_model_data.h&quot;
// 인터프리터가 모델에서 사용하는 
// Op(TensorFlow Operation 약자. 계산을 수행하는 핵심 노드를 의미)를
// 로드할 수 있게 하는 클래스
#include &quot;tensorflow/lite/micro/kernels/all_ops_resolver.h&quot;
// 디버깅을 위해 오류와 출력을 기록하는 클래스
#include &quot;tensorflow/lite/micro/micro_error_reporter.h&quot;
// 모델을 실행할 마이크로 컨트롤러용 TensorFlow Lite 인터프리터
#include &quot;tensorflow/lite/micro/micro_interpreter.h&quot;
// 테스트 작성을 위한 간단한 프레임워크. 실제 테스트를 실행
#include &quot;tensorflow/lite/micro/testing/micro_test.h&quot;
// sine_model_data.h의 모델 데이터를 분석하는 데 사용되는
// 텐서플로 라이트 플랫버퍼 데이터 구조를 정의하는 스키마
#include &quot;tensorflow/lite/schema/schema_generated.h&quot;
// 스키마의 현재 버전. 모델이 호한 가능한 버전으로 정의되어 있는지 확인
#include &quot;tensorflow/lite/version.h&quot;

// micro_test.h에 정의된 매크로. 테스트 시작
TF_LITE_MICRO_TESTS_BEGIN

// micro_test.h에 정의된 매크로. 테스트 수행 코드
TF_LITE_MICRO_TEST(LoadModelAndPerformInference) {
  // 디버그 정보 출력 메커니즘 설정
  // MicroErrorReporter 인스턴스 생성(/micro_error_reporter.h 정의).
  // 추론 중에 디버그 정보를 기록하는 메커니즘을 제공.
  tflite::MicroErrorReporter micro_error_reporter;
  // MicroErrorReporter의 인스턴스를 ErrorReporter에 설정
  tflite::ErrorReporter* error_reporter = &amp;amp;micro_error_reporter;

  // 사용 가능한 데이터 구조에 모델을 매핑한다.
  // 복사나 파싱을 포함하지 않는 가벼운 작업이다.
  // g_sine_model_data는 sine_model_data.h에 정의되어 있다.
  // Model은 schema_generated.h에 정의되어 있고 모델 데이터를 담는 구조체이다.
  const tflite::Model* model = ::tflite::GetModel(g_sine_model_data);
  // 모델의 버전 번호를 TensorFlow Lite 스키마 버전과 비교한다.
  if (model-&amp;gt;version() != TFLITE_SCHEMA_VERSION) {
  	// 버전 번호가 맞지 않으면 메세지를 기록한다.
    TF_LITE_REPORT_ERROR(error_reporter,
                         &quot;Model provided is schema version %d not equal &quot;
                         &quot;to supported version %d.\n&quot;,
                         model-&amp;gt;version(), TFLITE_SCHEMA_VERSION);
  }

  // 필요한 모든 Op(operation) 구현을 가져온다.
  // all_ops_resolver.h에 정의됨.
  // 마이크로 컨트롤러용 TensorFlow Lite 인터프리터가 Op에 접근할 수 있도록 한다.
  tflite::ops::micro::AllOpsResolver resolver;

  // 모델의 입력, 출력, 중간 텐서 배열에 사용할 메모리 영역을 생성한다.
  // 이 영역을 텐서 아레나(tensor arena)라고 부른다.
  // 사용하는 모델에서 최소값을 찾으려면, 시행착오가 필요하다.
  const int tensor_arena_size = 2 * 1024;
  uint8_t tensor_arena[tensor_arena_size];

  // 모델을 실행하기 위한 인터프리터를 빌드한다.
  tflite::MicroInterpreter interpreter(model, resolver, tensor_arena,
                                       tensor_arena_size, error_reporter);

  // 모델에서 사용하는 텐서에 대해 tensor_arena의 메모리를 할당
  TF_LITE_MICRO_EXPECT_EQ(interpreter.AllocateTensors(), kTfLiteOk);

  // 모델의 입력 텐서에 대한 포인터 획득
  // 여기서는 입력이 하나이므로 인덱스는 0으로 설정
  // c_api_internal.h에 정의
  TfLiteTensor* input = interpreter.input(0);

  // TF_LITE_MICRO_EXPECT_NE와 TF_LITE_MICRO_EXPECT_EQ는 테스트 프레임워크의 매크로이다.
  // 변수 값에 대한 assertion 코드이다.
  // 입력 텐서가 존재하는지 확인(NE = Not Equal)
  TF_LITE_MICRO_EXPECT_NE(nullptr, input);
  // 속성 &quot;dims&quot;는 텐서의 모양을 나타낸다. 각 차원의 원소는 하나이다.
  // 입력은 한 개의 원소를 포함하는 2D 텐서이므로 &quot;dims&quot;의 크기는 2이다.
  // (EQ = Equal)
  TF_LITE_MICRO_EXPECT_EQ(2, input-&amp;gt;dims-&amp;gt;size);
  // 각 원소의 값은 해당 텐서의 길이를 나타낸다.
  // 두 개의 단일 원소 텐서(하나가 다른 하나에 포함)를 갖는지 확인한다.
  TF_LITE_MICRO_EXPECT_EQ(1, input-&amp;gt;dims-&amp;gt;data[0]);
  TF_LITE_MICRO_EXPECT_EQ(1, input-&amp;gt;dims-&amp;gt;data[1]);
  // 입력은 32비트 부동소수점 값이다.
  TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, input-&amp;gt;type);

  // 입력 값을 제공한다.
  // data 변수는 TfLitePtrUnion(c_api_internal.h 정의)이다.
  input-&amp;gt;data.f[0] = 0.;

  // 입력 값으로 모델을 실행하고 성공 여부를 검사한다.
  TfLiteStatus invoke_status = interpreter.Invoke();
  if (invoke_status != kTfLiteOk) {
  	error_reporter-&amp;gt;Report(&quot;Invoke failed\n&quot;);
  }
  TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status);

  // 출력 텐서의 포인터를 획득하여 예상하는 속성을 가지고 있는지 확인한다.
  // 입력 텐서와 동일한 속성이다.
  TfLiteTensor* output = interpreter.output(0);
  TF_LITE_MICRO_EXPECT_EQ(2, output-&amp;gt;dims-&amp;gt;size);
  TF_LITE_MICRO_EXPECT_EQ(1, input-&amp;gt;dims-&amp;gt;data[0]);
  TF_LITE_MICRO_EXPECT_EQ(1, input-&amp;gt;dims-&amp;gt;data[1]);
  TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, output-&amp;gt;type);

  // 텐서의 출력 값을 가져온다.
  float value = output-&amp;gt;data.f[0];
  // 출력 값과 예상 값의 차이가 0.5 범위에 있는지 확인한다.
  TF_LITE_MICRO_EXPECT_NEAR(0., value, 0.05);

  // 몇 가지 값의 추론을 더 실행하여 예상하는 출력을 확인한다.
  // interpreter.input(0)와 interpreter.output(0)을 다시 호출할 필요가 없다.
  input-&amp;gt;data.f[0] = 1.;
  invoke_status = interpreter.Invoke();
  TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status);

  value = output-&amp;gt;data.f[0];
  TF_LITE_MICRO_EXPECT_NEAR(0.841, value, 0.05);

  input-&amp;gt;data.f[0] = 3.;
  invoke_status = interpreter.Invoke();
  TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status);

  value = output-&amp;gt;data.f[0];
  TF_LITE_MICRO_EXPECT_NEAR(0.141, value, 0.05);

  input-&amp;gt;data.f[0] = 5.;
  invoke_status = interpreter.Invoke();
  TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status);

  value = output-&amp;gt;data.f[0];
  TF_LITE_MICRO_EXPECT_NEAR(-0.959, value, 0.05);
}

//	micro_test.h에 정의된 매크로. 테스트 종료
TF_LITE_MICRO_TESTS_END&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 도서에서 제공되는 코드를 실행하는 절차는 아래와 같다(Ubuntu 20.04에서 실행함).&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다운로드할 디렉터리를 생성하고, 생성한 디렉터리로 이동한다.&lt;br /&gt;&lt;b&gt;$ mkdir TinyML&lt;/b&gt;&lt;br /&gt;&lt;b&gt;$ cd TinyML&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Github에서 소스를 다운로드하고 생성된 &quot;&lt;b&gt;tensorflow-lite&lt;/b&gt;&quot; 디렉터리로 이동한다(도서에 있는 경로로 하면 실행이 안된다).&lt;br /&gt;&lt;b&gt;$ git clone https://github.com/yunho0130/tensorflow-lite.git&lt;/b&gt;&lt;br /&gt;&lt;b&gt;$ cd tensorflow-lite&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;make 커맨드를 아래와 같이 실행하여 테스트를 수행한다(처음 make 실행시 시간이 다소 소요됨).&lt;br /&gt;&lt;b&gt;$ make&amp;nbsp;-f&amp;nbsp;tensorflow/lite/micro/tools/make/Makefile&amp;nbsp;test_hello_world_test&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 실행하면 도서의 내용과 다르게 출력된다.&lt;/p&gt;
&lt;pre id=&quot;code_1689815923773&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'~~~ALL TESTS PASSED~~~'
tensorflow/lite/micro/tools/make/gen/linux_x86_64/bin/hello_world_test: PASS&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도서의 내용 처럼 인위적으로 실패하게 수정하면, 도서의 내용과 동일하게 출력된다.&lt;/p&gt;
&lt;pre id=&quot;code_1689816100534&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Testing LoadModelAndPerformInference
0. (1.0*2^-127) near value (1.6142864*2^-1) failed at tensorflow/lite/micro/examples/hello_world/hello_world_test.cc:92
0/1 tests passed
~~~SOME TESTS FAILED~~~&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;hello_world 프로젝트 파일 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 마이크로 컨트롤러에서 사용할 &lt;b&gt;hello_world&lt;/b&gt; 프로젝의 파일 구조를 살펴본다.&amp;nbsp;해당 프로젝트의 루트는 &quot;&lt;b&gt;tensorflow/lite/micro/examples/hello_world&lt;/b&gt;&quot;에 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;BUILD&lt;/b&gt; : 테스트를 포함하여 애플리케이션의 소스 코드를 사용하여 빌드할 수 있는 다양한 항목을 나열하는 파일.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Makefile.inc&lt;/b&gt; : 테스트와 애플리케이션의 빌드 대상에 대한 정보가 포함된 Makefile(일부 소스 파일을 정의).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;README.md&lt;/b&gt; : 애플리케이션 빌드와 실행에 대한 절차를 포함하는 텍스트 파일.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;constants.h, constants.cc&lt;/b&gt; : 프로그램 동작을 정의하는 데 중요한 영향을 미치는 다양한 상수를 포함하는 파일 세트.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;create_sine_model.ipynb&lt;/b&gt; : 신경망 모델을 만드는 주피터 노트북.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;hello_world_test.cc&lt;/b&gt; : 생성한 신경망 모델을 사용하여 추론을 실행하는 테스트.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;main.cc&lt;/b&gt; : 애플리케이션의 실행되는 프로그램 진입점.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;main_functions.h, main_functions.cc&lt;/b&gt; : 프로그램에 필요한 모든 초기화를 수행하는 setup() 함수와 프로그램의 핵심 로직을 포함하고 상태 머신을 무한히 순환하게 설계된 loop() 함수를 정의하는 파일 세트. main.cc에 의해 호출.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;output_handler.h, output_handler.cc&lt;/b&gt; : 추론을 실행될 때마다 출력을 표시하는 데 사용할 수 있는 함수를 정의하는 파일 세트. 기본 구현은 결과를 화면에 출력하고 이 구현을 재정의하여 다른 작업을 수행할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;output_handler_test.cc&lt;/b&gt; : output_handler.h, output_handler.cc의 코드가 올바르게 작동하는지 검증하는 테스트.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;sine_model_data.h, sine_model_data.cc&lt;/b&gt; : 생성된 신경망 모델의 데이터 배열을 정의하는 파일 세트.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로컨트롤러마다 기능과 API가 다르기 때문에 특정 디바이스용으로 빌드하는 경우 프로젝트 구조를 통해 특정 디바이스의 소스 파일을 제공할 수 있다. 아래의 디렉러리는 특정 디바이스에서 제공하는 소스 파일을 포함한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;/arduino&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/disco_f746ng&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/esp&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/sparkfun_edge&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;소스 코드 분석&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;main_functions.cc&lt;/b&gt; 파일 코드 분석 (설명은 코드 주석으로 대신한다.)&lt;/p&gt;
&lt;pre id=&quot;code_1689907446001&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	아파치 2.0 오픈소스 라이선스 정보이다.
/* Copyright 2019 The TensorFlow Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==============================================================================*/
// 소스에서 사용하는 헤더 파일을 정의한다.
#include &quot;tensorflow/lite/micro/examples/hello_world/main_functions.h&quot;

#include &quot;tensorflow/lite/micro/examples/hello_world/constants.h&quot;
#include &quot;tensorflow/lite/micro/examples/hello_world/output_handler.h&quot;
#include &quot;tensorflow/lite/micro/examples/hello_world/sine_model_data.h&quot;
#include &quot;tensorflow/lite/micro/kernels/all_ops_resolver.h&quot;
#include &quot;tensorflow/lite/micro/micro_error_reporter.h&quot;
#include &quot;tensorflow/lite/micro/micro_interpreter.h&quot;
#include &quot;tensorflow/lite/schema/schema_generated.h&quot;
#include &quot;tensorflow/lite/version.h&quot;

// 아두이노 스타일과 호환성을 위해 사용한다.
// 소스 파일내에서 사용할 전역 변수를 정의한다.
// 네임스페이스로 묶어서 소스내에서는 접근할 수 있지만,
// 프로젝트 내의 다른 파일에서는 접근할 수 없다.
// 동일한 변수를 서로 다른 파일에서 정의할 때 생기는 문제를 방지할 수 있다.
namespace {
// 아래 변수는 테스트 코드 작성에서 정의한 변수와 동일.
tflite::ErrorReporter* error_reporter = nullptr;
const tflite::Model* model = nullptr;
tflite::MicroInterpreter* interpreter = nullptr;
TfLiteTensor* input = nullptr;
TfLiteTensor* output = nullptr;
// 추론을 실행한 횟수를 기록
int inference_count = 0;

// 입력, 출력, 중간 배열에 사용할 메모리 영역을 생성한다.
// 신경망 모델의 최솟값을 찾으려면 시행착오가 필요하다.
constexpr int kTensorArenaSize = 2 * 1024;
uint8_t tensor_arena[kTensorArenaSize];
}  // namespace

// 함수의 이름은 아두이노와 호환을 위해 중요하다.
// 프로그램이 처음 실행될 때 한번만 호출된다.
// 추론을 시작하기 전에 수행해야 할 일회성 작업을 수행한다.
void setup() {
  // 로깅 설정. Google 스타일은 수명 불확실성 때문에 전역이나 정적을 피하지만,
  // 사소한 소멸자가 있어 상관없다.
  // NOLINTNEXTLINE(runtime-global-variables)
  static tflite::MicroErrorReporter micro_error_reporter;
  error_reporter = &amp;amp;micro_error_reporter;

  // 모델을 사용할 데이터 구조체에 매핑한다.
  // 이는 복사나 파싱을 포함하지 않는 매우 가벼운 작업이다.
  model = tflite::GetModel(g_sine_model_data);
  if (model-&amp;gt;version() != TFLITE_SCHEMA_VERSION) {
    TF_LITE_REPORT_ERROR(error_reporter,
                         &quot;Model provided is schema version %d not equal &quot;
                         &quot;to supported version %d.&quot;,
                         model-&amp;gt;version(), TFLITE_SCHEMA_VERSION);
    return;
  }

  // 필요한 모든 오퍼레이션 구현을 가져온다.
  // NOLINTNEXTLINE(runtime-global-variables)
  static tflite::ops::micro::AllOpsResolver resolver;

  // 모델을 실행할 인터프리터를 빌드한다.
  static tflite::MicroInterpreter static_interpreter(
      model, resolver, tensor_arena, kTensorArenaSize, error_reporter);
  interpreter = &amp;amp;static_interpreter;

  // 모델의 텐서를 tensor_arena로부터 메모리 할당한다.
  TfLiteStatus allocate_status = interpreter-&amp;gt;AllocateTensors();
  if (allocate_status != kTfLiteOk) {
    TF_LITE_REPORT_ERROR(error_reporter, &quot;AllocateTensors() failed&quot;);
    return;
  }

  // 모델의 입력/출력 텐서에 대한 포인터를 가져온다.
  // TfLiteTensor라는 구조체가 가진 data 멤버는 출력을 저장하기 위한
  // 할당된 메모리 영역을 가리킨다. 출력이 없더라고 data 메모리 영역은 존재한다.
  input = interpreter-&amp;gt;input(0);
  output = interpreter-&amp;gt;output(0);

  // 추론을 실행한 횟수를 기록하기 위한 변수 초기화
  inference_count = 0;
}

// 함수의 이름은 아두이노와 호환을 중요하다.
// 계속 반복되는 실행 코드가 위치한다.
void loop() {
  // 모델에 전달할 x 값을 계산한다.
  // 현재 inference_count를 주기당 추론 횟수와 비교하여
  // 모델이 학습된 지정 가능한 x 값 범위 내에서 위치를 결정하고
  // 이를 사용하여 값을 계산한다.
  // kXrange, kInferencesPerCycle 상수는 constants.h, constants.cc에 정의
  float position = static_cast&amp;lt;float&amp;gt;(inference_count) /
                   static_cast&amp;lt;float&amp;gt;(kInferencesPerCycle);
  float x_val = position * kXrange;

  // 계산된 x 값을 모델의 입력 텐서에 넣는다.
  input-&amp;gt;data.f[0] = x_val;

  // 추론을 실행하고 에러를 리포트한다.
  TfLiteStatus invoke_status = interpreter-&amp;gt;Invoke();
  if (invoke_status != kTfLiteOk) {
    TF_LITE_REPORT_ERROR(error_reporter, &quot;Invoke failed on x_val: %f\n&quot;,
                         static_cast&amp;lt;double&amp;gt;(x_val));
    return;
  }

  // 모델의 출력 텐서에서 예측된 y 값을 읽는다.
  float y_val = output-&amp;gt;data.f[0];

  // 결과를 출력한다. 사용자 지정 HandleOutput 함수는 
  // 지원되는 하드웨어 장비에 대해 구현될 수 있다.
  HandleOutput(error_reporter, x_val, y_val);

  // inference_counter를 증가시키고
  // 주기당 최대 추론 수에 도달하면 재설정한다.
  inference_count += 1;
  if (inference_count &amp;gt;= kInferencesPerCycle) inference_count = 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;main_functions.cc&lt;/b&gt; 파일의 &lt;b&gt;setup()&lt;/b&gt;, &lt;b&gt;loop()&lt;/b&gt; 함수는 &lt;b&gt;main.cc&lt;/b&gt;에서 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;main.cc&lt;/b&gt; 파일 코드 분석 (설명은 코드 주석으로 대신한다.)&lt;/p&gt;
&lt;pre id=&quot;code_1689917612091&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	아파치 2.0 오픈소스 라이선스 정보이다.
/* Copyright 2019 The TensorFlow Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==============================================================================*/
// setup(), loop() 함수가 정의된 헤더 파일을 포함한다.
#include &quot;tensorflow/lite/micro/examples/hello_world/main_functions.h&quot;

// 이 함수는 표준 C 엔트리 포인트를 가지는 시스템에서 사용되는 기본 main이다.
// 엔트리 코드에 대해 다른 요구 사항(app_main 함수와 같은)을 가지는 다른 디바이스
// (예로 FreeRTOS나 ESP32)는 대상별 하위 폴더에서 main.cc 파일을 특수화해야 한다.
int main(int argc, char* argv[]) {  
  setup();
  while (true) {
    loop();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;호스트에서 애플리케이션 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션에서 실행하려면 빌드를 진행해야 한다. 아래는 리눅스에서 &lt;b&gt;make&lt;/b&gt; 명령을 사용하여 실행 가능한 바이너리를 생성하는 방법이다.&lt;/p&gt;
&lt;pre id=&quot;code_1689922998802&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ make -f tensorflow/lite/micro/tools/make/Makefile hello_world&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드가 완료되면 아래와 같이 바이너리를 실행할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1689923078746&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ./tensorflow/lite/micro/tools/make/gen/linux_x86_64/bin/hello_world&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이너리가 실행되면 아래와 같이 출력된다.&lt;/p&gt;
&lt;pre id=&quot;code_1689923343180&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x_value: 1.2566366*2^-1, y_value: 1.1161486*2^-1
x_value: 1.8849551*2^-1, y_value: 1.5661856*2^-1
x_value: 1.2566366*2^0, y_value: 1.8288908*2^-1
x_value: 1.5707957*2^0, y_value: 1.9224764*2^-1
x_value: 1.8849551*2^0, y_value: 1.8043818*2^-1
x_value: 1.995567*2^1, y_value: 1.5224055*2^-1
x_value: 1.2566366*2^1, y_value: 1.1094988*2^-1
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션을 종료하려면 &quot;Ctrl + c&quot;를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마이크로 컨트롤러에 배포&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 &lt;s&gt;&lt;b&gt;STM32H750 디스커버리 키트&lt;/b&gt;&lt;/s&gt;에 배포하는 절차를 설명한다(도서에서 설명하는 보드가 없는 관계로...).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;※ STM32H750 디스커버리 키트는 내부 플래시 용량(128KBytes) 문제로 실행할 수 없다. DISCO_F746NG를 사용하는 mbed 환경 설정과 컴파일 과정만 정리한다.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마이크로 컨트롤러란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 마이크로 컨트롤러는 회로 기판(PCB)에 부착된 많은 전자 부품 중 하나이다. 마이크로 컨트롤러는 핀으로 회로 기판에 연결된다. 일반적인 마이크로 컨트롤러는 수십 개의 핀이 있으며 모두 용도가 다르다. 어떤 핀은 전원을 공급하고 어떤 핀은 다른 중요한 부품과 연결된다. 마이크로 컨트롤러에서 실행되는 프로그램에 의해 디비털 신호의 입력과 출력을 수행하는 핀을 GPIO(General Purpose Input/Output) 핀이라 한다. GPIO 핀이 입력으로 동작하면 전압이 외부에서 들어오는지 검사할 수 있고, 출력으로 동작하면 전압을 외부로 공급하게 된다. GPIO 핀은 디지털이므로 출력 모드에서 스위치처럼 ON/OFF 동작을 한다. 입력 모드에서는 전압이 특정 임계값보다 높거나 낮은지 검사할 수 있다. 아날로그 입력 핀이 있는 일부 마이크로 컨트롤러는 정확한 입력 값을 측정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DISCO_F746NG용 MBED 환경 설정 및 컴파일&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ubuntu 20.04&lt;/b&gt;에서 환경 설정 및 컴파일 방법을 설명한다. 도서에 자세히 설명되어 있으나, 몇 가지 수정 사항이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;b&gt;MBED CLI&lt;/b&gt;&amp;nbsp; 환경 설정을 한다(&lt;a title=&quot;mbed install and setup&quot; href=&quot;https://os.mbed.com/docs/mbed-os/v6.16/build-tools/install-and-set-up.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고 사이트&lt;/a&gt;).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ubuntu&lt;/b&gt;에서 필요한 패키지를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690867013214&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt install python3 python3-pip git mercurial&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mbed CLI&lt;/b&gt;를 설치하고 업데이트 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690867064199&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python3 -m pip install mbed-cli&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1690867100974&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python3 -m pip install -U mbed-cli&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러를 다운 받아서 적당한 위치에 압축을 푼다. 컴파일러는 &lt;a title=&quot;gcc arm compiler&quot; href=&quot;https://developer.arm.com/downloads/-/gnu-rm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;에서 다운 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크에서 &lt;b&gt;gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2&lt;/b&gt;(2023/8/1 기준, 향후 업데이트 될 수 있음)를 다운 받아 압축을 푼다.&lt;/p&gt;
&lt;pre id=&quot;code_1690867345672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ tar -xvf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mbed CLI&lt;/b&gt;에서 컴파일러를 구성한다. 아래 명령어를 사용하여 &quot;&lt;b&gt;ARM_PATH&lt;/b&gt;&quot;와 &quot;&lt;b&gt;GCC_ARM_PATH&lt;/b&gt;&quot;를 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690867566994&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mbed config -G ARM_PATH &quot;&amp;lt;압축푼 위치&amp;gt;/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1690867590463&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mbed config -G GCC_ARM_PATH &quot;&amp;lt;압축푼 위치&amp;gt;/gcc-arm-none-eabi-10.3-2021.10/bin&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GitHub&lt;/b&gt;에서 소스를 다운로드한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690867995162&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone https://github.com/yunho0130/tensorflow-lite.git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 디렉터리로 이동한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690868041063&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd tensorflow-lite&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 도서에 나오는 내용대로 진행을 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690867701830&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ make -f tensorflow/lite/micro/tools/make/Makefile TARGET=mbed TAGS=&quot;cmsis disco_f746ng&quot; generate_hello_world_mbed_project&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도서에는 &lt;b&gt;TAGS&lt;/b&gt;가 &quot;&lt;b&gt;CMSIS disco_f746ng&lt;/b&gt;&quot;로 되어있으나, 이렇게 수행하면 &lt;b&gt;make&lt;/b&gt;에서 에러가 난다. &quot;&lt;b&gt;CMSIS&lt;/b&gt;&quot;를 소문자 &quot;&lt;b&gt;cmsis&lt;/b&gt;&quot;로 변경하면 에러 없이 진행할 수 있다. &lt;b&gt;github&lt;/b&gt;에서 &quot;&lt;b&gt;cmsis-nn&lt;/b&gt;&quot;으로 하라고 되어 있으나, 나중에 컴파일시 에러가 발생한다(에러를 해결하려다 포기).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 생성된 디렉터리로 이동한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690868070088&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd cd tensorflow/lite/micro/tools/make/gen/mbed_cortex-m4/prj/hello_world/mbed/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mbed&lt;/b&gt; 프로젝트의 루트를 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690868128867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mbed config root .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mbed&lt;/b&gt; 종속성을 다운로드한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690868200446&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mbed deploy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mbed&lt;/b&gt;에서 사용할 컴파일러를 설정한다. 기본으로 C++98로 컴파일을 하는데 C++11로 변경한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690868275367&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python -c 'import fileinput, glob;
for filename in glob.glob(&quot;mbed-os/tools/profiles/*.json&quot;):
    for line in fileinput.input(filename, inplace=True):
        print(line.replace(&quot;\&quot;-std=gnu++98\&quot;&quot;,&quot;\&quot;-std=c++11\&quot;-fpermissive\&quot;&quot;))'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령을 사용하여 컴파일을 진행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690868311119&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mbed compile -m DISCO_F746NG -t GCC_ARM&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일이 완료되면, 아래와 같은 내용을 볼 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690868347559&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Link: mbed
Elf2Bin: mbed
| Module                              |           .text |       .data |          .bss |
|-------------------------------------|-----------------|-------------|---------------|
| BSP_DISCO_F746NG/Drivers            |     2400(+2400) |       1(+1) |     584(+584) |
| BSP_DISCO_F746NG/Utilities          |           0(+0) |       8(+8) |         0(+0) |
| LCD_DISCO_F746NG/LCD_DISCO_F746NG.o |       150(+150) |       0(+0) |         0(+0) |
| [fill]                              |       126(+126) |       7(+7) |       26(+26) |
| [lib]/c.a                           |   35640(+35640) | 2472(+2472) |       58(+58) |
| [lib]/gcc.a                         |     3448(+3448) |       0(+0) |         0(+0) |
| [lib]/m.a                           |     6216(+6216) |       0(+0) |         0(+0) |
| [lib]/misc                          |       188(+188) |       4(+4) |       28(+28) |
| [lib]/nosys.a                       |         32(+32) |       0(+0) |         0(+0) |
| [lib]/stdc++.a                      |         40(+40) |       0(+0) |       16(+16) |
| mbed-os/drivers                     |       872(+872) |       0(+0) |         0(+0) |
| mbed-os/hal                         |     1314(+1314) |       8(+8) |     130(+130) |
| mbed-os/platform                    |     4268(+4268) |   260(+260) |     240(+240) |
| mbed-os/targets                     |   12778(+12778) |       4(+4) |   1152(+1152) |
| tensorflow/lite                     |   77536(+77536) |       4(+4) |   8118(+8118) |
| Subtotals                           | 145008(+145008) | 2768(+2768) | 10352(+10352) |
Total Static RAM memory (data + bss): 13120(+13120) bytes
Total Flash memory (text + data): 147776(+147776) bytes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이너리 크기가 &lt;b&gt;140KBytes&lt;/b&gt; 정도가 나와서 &lt;b&gt;DISCO_H750B&lt;/b&gt;에서는 돌릴 수가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 사이트&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;th style=&quot;width: 60%; height: 21px;&quot;&gt;사이트&lt;/th&gt;
&lt;th style=&quot;width: 40%; height: 21px;&quot;&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 27px;&quot;&gt;
&lt;td style=&quot;width: 60%; height: 27px;&quot;&gt;&lt;a title=&quot;도서&quot; href=&quot;https://www.hanbit.co.kr/store/books/look.php?p_code=B3963656224&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;초소형 머신러닝 TinyML&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40%; height: 27px;&quot;&gt;TinyML 도서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;&lt;a href=&quot;https://github.com/tensorflow/tensorflow/tree/be4f6874533d78f662d9777b66abe3cdde98f901/tensorflow/lite/experimental/micro&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/tensorflow/tensorflow/tree/be4f6874533d78f662d9777b66abe3cdde98f901/tensorflow/lite/experimental/micro&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;TinyML 도서 오픈소스 Github 저장소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;&lt;a href=&quot;https://github.com/yunho0130/tensorflow-lite&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/yunho0130/tensorflow-lite&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;TinyML 도서 오픈소스 Github 저장소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 60%; height: 20px;&quot;&gt;&lt;a href=&quot;https://www.sparkfun.com/products/retired/15420&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.sparkfun.com/products/retired/15420&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40%; height: 20px;&quot;&gt;스파크펀 에지2 제조사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 60%; height: 20px;&quot;&gt;&lt;a href=&quot;https://github.com/sparkfun/SparkFun_Edge&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/sparkfun/SparkFun_Edge&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40%; height: 20px;&quot;&gt;스파크펀 에지2 Github 저장소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Machine Learning/TinyML</category>
      <category>machine learning</category>
      <category>tinyml</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2382</guid>
      <comments>https://devdockr.tistory.com/2382#entry2382comment</comments>
      <pubDate>Fri, 14 Jul 2023 14:40:37 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Plus 개발 환경 구축 - Yocto 사용자 정의</title>
      <link>https://devdockr.tistory.com/2381</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Yocto Command 정리&quot; href=&quot;https://devdockr.tistory.com/2371&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [다음]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Yocto 사용자 정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발중 또는 제품화에서 필요한 &lt;b&gt;Yocto 사용자 정의&lt;/b&gt;를 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SD Card, EMMC의 ROOTFS 크기 조정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;imx8mp-evk&lt;/b&gt;&lt;/i&gt;에서 &quot;&lt;i&gt;&lt;b&gt;imx-image-full&lt;/b&gt;&lt;/i&gt;&quot;로 이미지를 생성하면 대략 &lt;b&gt;8GB&lt;/b&gt;의 &lt;b&gt;rootfs&lt;/b&gt; 이미지가 만들어 진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 사용하려는 &lt;b&gt;SD Card&lt;/b&gt;나 &lt;b&gt;EMMC&lt;/b&gt;의 용량이 &lt;b&gt;8GB&lt;/b&gt; 보다 크면, &lt;b&gt;8GB&lt;/b&gt;를 제외한 저장 공간이 사용되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SD Card&lt;/b&gt;나 &lt;b&gt;EMMC&lt;/b&gt;의 저장 공간을 최대한 사용하려면 아래의 단계를 따른다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;&lt;b&gt;imx-image-full&lt;/b&gt;&quot;을 사용하여 생성된 이미지를 &lt;b&gt;SD Card&lt;/b&gt;나 &lt;b&gt;EMMC&lt;/b&gt;에 플래싱(저장)한다.&lt;/li&gt;
&lt;li&gt;보드를 부팅후 &quot;&lt;b&gt;df -h&lt;/b&gt;&quot; 커맨드(크기에 따라 &lt;b&gt;MB&lt;/b&gt;나 &lt;b&gt;GB&lt;/b&gt;로 출력된다)를 사용하여 저장 공간을 확인한다.&lt;br /&gt;&lt;b&gt;Filesystem&lt;/b&gt;의 &quot;&lt;b&gt;/dev/root&lt;/b&gt;&quot;의 저장 공간 크기를 확인한다. 이 크기가 실제&amp;nbsp;&lt;b&gt;rootfs&lt;/b&gt;의 크기이다(기본으로 &lt;b&gt;8GB&lt;/b&gt; 정도이다).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SD Card&lt;/b&gt;나 &lt;b&gt;EMMC&lt;/b&gt;의 실제 저장 공간에서 위에서 확인한 크기를 제외한 사용되지 않는 저장 공간을 계산한다.&lt;br /&gt;예로 &lt;b&gt;SD Card&lt;/b&gt;나 &lt;b&gt;EMMC&lt;/b&gt;가 &lt;b&gt;16GB&lt;/b&gt;인 경우 &lt;b&gt;8GB&lt;/b&gt;의 사용되지 않는 저장 공간이 있다.&lt;/li&gt;
&lt;li&gt;사용되지 않는 공간보다 적은 크기의 추가 공간의 크기를 결정한다.&lt;br /&gt;추가 공간의 크기는 &lt;b&gt;KB&lt;/b&gt; 단위로 설정하게 되어 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 &lt;b&gt;5GB&lt;/b&gt;를 추가한다고 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;&amp;lt;build-dir&amp;gt;/conf/local.conf&lt;/b&gt;&quot; 파일에 아래 내용을 추가한다(&lt;b&gt;&amp;lt;build-dir&amp;gt;&lt;/b&gt;은 빌드 디렉터리이다).&lt;/p&gt;
&lt;pre id=&quot;code_1689126042724&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IMAGE_ROOTFS_EXTRA_SPACE = &quot;5242880&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;a title=&quot;IMAGE_ROOTFS_EXTRA_SPACE&quot; href=&quot;https://docs.yoctoproject.org/2.0/ref-manual/ref-manual.html#var-IMAGE_ROOTFS_EXTRA_SPACE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;IMAGE_ROOTFS_EXTRA_SPACE&lt;/b&gt;&lt;/a&gt;&quot;는 &lt;b&gt;rootfs&lt;/b&gt;에 포함할 추가 용량을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 다시 빌드하면, &lt;b&gt;5GB&lt;/b&gt;가 추가된 이미지가 생성된다(총 &lt;b&gt;13GB&lt;/b&gt;의 &lt;b&gt;rootfs&lt;/b&gt; 생성).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1GB&lt;/b&gt;는 &quot;&lt;b&gt;1048576&lt;/b&gt;&quot;으로 계산된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;imx-linux-kirkstone&lt;/b&gt;&quot; 이후에 생성된 이미지는 압축되어 있어서 이미지 저장시(플래싱) 시간을 단축할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에는 &quot;&lt;b&gt;wic&lt;/b&gt;&quot; 확장자를 가진 이미지를 업데이트 했었는데, 이 이미지는 실제 &lt;b&gt;rootfs&lt;/b&gt;의 크기와 동일하여 &lt;b&gt;13GB&lt;/b&gt;의 이미지 생성시 실제로 파일 크기가 &lt;b&gt;13GB&lt;/b&gt;가 생성이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 &quot;&lt;b&gt;zst&lt;/b&gt;&quot;로 압축된 이미지가 생성되어 실제 &lt;b&gt;rootfs&lt;/b&gt; 크기보다 훨씬 적은 크기의 이미지가 생성이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;21GB&lt;/b&gt;의 &lt;b&gt;rootfs&lt;/b&gt;를 생성하면 실제 크기는 &lt;b&gt;1.3GB&lt;/b&gt; 정도가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 추가되는 크기는 모두 패팅으로 처리되는 것으로 보여진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 &quot;&lt;b&gt;zst&lt;/b&gt;&quot;로 생성된 이미지를 &quot;&lt;b&gt;dd&lt;/b&gt;&quot; 커맨드를 이용하여 &lt;b&gt;EMMC&lt;/b&gt;에 저장하는 커맨드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1689126711539&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zstdcat imx-image-full.rootfs.wic.zst | dd of=/dev/mmcblk2 bs=1M status=progress conv=fsync&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 설명하면 &quot;&lt;b&gt;zst&lt;/b&gt;&quot;로 압축된 파일을 &quot;&lt;b&gt;zstdcat&lt;/b&gt;&quot;로 압축을 해제하여, &quot;&lt;b&gt;dd&lt;/b&gt;&quot; 커맨드로 보내서&amp;nbsp;&amp;nbsp;&lt;b&gt;EMMC&lt;/b&gt;로 저장하는 커맨드이다. &quot;&lt;b&gt;wic&lt;/b&gt;&quot;로 생성된 이미지를 저장하는 것보다 수배 빠르게 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;status=progress&lt;/b&gt;&quot;를 추가하면, 작업 진행 상황을 확인할 수 있어서 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Application 개발 환경 구축 (개발 툴 관련)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Application&lt;/b&gt; 개발 환경 구축(개발 툴 관련)과 관련하여 아래 사이트에 정리가 잘 되어 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a title=&quot;VSCode&quot; href=&quot;https://variwiki.com/index.php?title=Yocto_Programming_with_VSCode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;VSCode&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;CodeBlocks&quot; href=&quot;https://variwiki.com/index.php?title=Yocto_Programming_with_CodeBlocks&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;CodeBlocks&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;Eclipse v2&quot; href=&quot;https://variwiki.com/index.php?title=Yocto_Programming_with_Eclipse_v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Eclipse v2&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명은 &lt;b&gt;i.MX8M-Mini&lt;/b&gt;이지만 &lt;b&gt;i.MX8M Plus&lt;/b&gt;에도 적용이 가능하다(동일하다고 생각해도 된다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 &lt;b&gt;VSCode&lt;/b&gt;를 기준으로 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;VSCode 디버그를 지원하는 rootfs 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VSCode&lt;/b&gt; 디버그를 지원하는 &lt;b&gt;rootfs&lt;/b&gt;를 생성하려면, &quot;&lt;b&gt;&amp;lt;build-dir&amp;gt;/conf/local.conf&lt;/b&gt;&quot; 파일에 아래 내용을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689129322511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EXTRA_IMAGE_FEATURES += &quot; \
    tools-debug \
    ssh-server-dropbear \
    &quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;a title=&quot;EXTRA_IMAGE_FEATURES&quot; href=&quot;https://docs.yoctoproject.org/2.0/ref-manual/ref-manual.html#var-EXTRA_IMAGE_FEATURES&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;EXTRA_IMAGE_FEATURES&lt;/b&gt;&lt;/a&gt;&quot;는 이미지에 포함할 추가 기능 목록을 나타낸다(링크에 자세한 내용이 설명되어 있다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VSCode&lt;/b&gt;로 디버깅하려면, 선호하는 &lt;b&gt;SSH&lt;/b&gt; 서버(&lt;b&gt;openssh&lt;/b&gt;, &lt;b&gt;dropbear&lt;/b&gt; 등), &lt;b&gt;gdb&lt;/b&gt; 또는 &lt;b&gt;gdbserver&lt;/b&gt;가 대상 디바이스에 설치되어 있어야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;tools-debug&lt;/b&gt; : &lt;b&gt;gdb&lt;/b&gt;, &lt;b&gt;strace&lt;/b&gt;와 같은 디버깅 도구를 설치한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ssh-server-dropbear&lt;/b&gt; : &lt;span style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Dropbear&lt;/b&gt; 최소 기능의 &lt;b&gt;SSH&lt;/b&gt; 서버를 설치한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;rootfs&lt;/b&gt;를 생성한 후 대상 디바이스에 이미지를 저장(플래싱)한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;호스트 PC 환경 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상 호스트 &lt;b&gt;PC&lt;/b&gt;에 &lt;span style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Ubuntu 20.04&lt;/b&gt;가 설치되어 있다고 가정하고 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;필요한 패키지를 아래와 같이 설치한다(&lt;b&gt;Yocto&lt;/b&gt; 이미지를 빌드하는 호스트라면 이미 설치되어 있다고 나올 수 있다).&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689130602295&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get -y update
$ sudo apt-get -y install build-essential gdb gdb-multiarch git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;리눅스용 &lt;b&gt;VScode&lt;/b&gt;를 아래와 같이 설치한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689130715183&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo snap install --classic code&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VSCode&lt;/b&gt;의 확장 기능을 아래와 같이 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689130855086&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ code --install-extension ms-vscode.cpptools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커맨드 실생 후 &lt;b&gt;C/C++&lt;/b&gt;과 관련된 확장 기능이 설치된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Yocto Toolchain&lt;/b&gt;(&lt;b&gt;SDK&lt;/b&gt;)을 설치한다(SDK 설치). &lt;b&gt;SDK&lt;/b&gt;는 &quot;&lt;b&gt;&lt;a title=&quot;Yocto Command 정리&quot; href=&quot;https://devdockr.tistory.com/2371&quot;&gt;Yocto Command 정리&lt;/a&gt;&lt;/b&gt;&quot;의 &quot;&lt;b&gt;SDK 빌드&lt;/b&gt;&quot;를 참고하여 빌드 후 생성된 &lt;b&gt;SDK&lt;/b&gt;를 설치하면 된다(설치 경로를 꼭 확인한다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;VSCode에서 프로젝트 생성, 컴파일 및 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 &lt;b&gt;OpevCV&lt;/b&gt;를 이용하여 카메라 영상을 캡쳐하여 디스플레이하는 단순한 &lt;b&gt;Application&lt;/b&gt;을 만들면서 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 &lt;b&gt;PC&lt;/b&gt;에서 아래와 같이 프로젝트 디렉터리를 생성하고, &lt;b&gt;VSCode&lt;/b&gt;를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689135104230&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir ~/opencv-test
$ cd ~/opencv-test
$ code .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;opencv-test&lt;/b&gt;&quot; 디렉터리를 생성하고 &quot;&lt;b&gt;opencv-test&lt;/b&gt;&quot; 디렉터리로 이동 후, &lt;b&gt;VSCode&lt;/b&gt;를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 화면이 나온다(&lt;b&gt;Ubuntu&lt;/b&gt;를 &lt;b&gt;WSL2&lt;/b&gt; 상에서 실행하기 때문에 &lt;b&gt;WSL&lt;/b&gt;이라는 문구를 볼 수 있다).&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vscode_00.png&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7g564/btsngTS4xwM/0mzlBc4n5y8pRgNyCi8jN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7g564/btsngTS4xwM/0mzlBc4n5y8pRgNyCi8jN1/img.png&quot; data-alt=&quot;VSCode 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7g564/btsngTS4xwM/0mzlBc4n5y8pRgNyCi8jN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7g564%2FbtsngTS4xwM%2F0mzlBc4n5y8pRgNyCi8jN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1155&quot; height=&quot;678&quot; data-filename=&quot;vscode_00.png&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VSCode 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;opencv-test&lt;/b&gt;&quot; 디렉터리에 아래 테이블과 같이 파일과 디렉터리를 생성한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 30%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;파일 및 경로&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 70%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;설명&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;main.cpp&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;샘플 프로그램 opencv-test.bin의 소스 코드.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;Makefile&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;main.cpp를 opencv-test.bin으로 크로스 컴파일하기 위한 Makefile.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;.vscode/settings.json&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;SDK/toolchain에 대한 전역 환경 변수를 구성하는 VSCode 파일.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;.vscode/tasks.json&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;새로운 작업을 재정의하거나 추가하는 VSCode 파일. VSCode 빌드 커맨드가 실행될 때 Makefile이 실행된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;.vscode/c_cpp_properties.json&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;IntelliSense의 포함 경로를 구성하는 VSCode 파일.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일이나 디렉터리를 생성하려면, &lt;b&gt;VSCode&lt;/b&gt;의&amp;nbsp;&quot;&lt;b&gt;EXPLORER&lt;/b&gt;&quot;에서 마우스 오른쪽을 클릭하고 &quot;&lt;b&gt;New File...&lt;/b&gt;&quot;, &quot;&lt;b&gt;New Folder...&lt;/b&gt;&quot;를 선택한다.&lt;/p&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; data-ke-style=&quot;alignCenter&quot;&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vscode_01.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zGPny/btsnitzGp9U/2GJWefgG1uE7tWSaDFIwP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zGPny/btsnitzGp9U/2GJWefgG1uE7tWSaDFIwP0/img.png&quot; data-alt=&quot;파일과 디렉터리 생성 후 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zGPny/btsnitzGp9U/2GJWefgG1uE7tWSaDFIwP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzGPny%2FbtsnitzGp9U%2F2GJWefgG1uE7tWSaDFIwP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1094&quot; height=&quot;678&quot; data-filename=&quot;vscode_01.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일과 디렉터리 생성 후 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;main.cpp&lt;/b&gt;의 코드는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1689139555700&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;opencv2/opencv.hpp&amp;gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;
using namespace cv;

int main(){
	// Create a VideoCapture object
	VideoCapture cap(2);

	// Check if camera opened successfully
	if(!cap.isOpened()){
		cout &amp;lt;&amp;lt; &quot;Error opening video stream&quot; &amp;lt;&amp;lt; endl;
		return -1;
	}

	while(1) {
		Mat frame;

		// Capture frame-by-frame
		cap &amp;gt;&amp;gt; frame;

		// If the frame is empty, break immediately
		if (frame.empty())
			break;

		// Display the resulting frame
		imshow( &quot;Frame&quot;, frame );

		// Press ESC on keyboard to exit
		char c = (char)waitKey(1);
		if( c == 27 )
			break;
	}

	// When everything done, release the video capture
	cap.release();

	// Closes all the frames
	destroyAllWindows();
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 소스 코드를 설명하면, 캡처 디바이스로 &quot;&lt;b&gt;/dev/video2&lt;/b&gt;&quot;를 열고 프레임을 캡처하여 화면에 이미지를 보여주는 간단한 코드이다. 사용하는 환경에 맞게 캡처 디바이스를 수정해서 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;main.cpp&lt;/b&gt;를 크로스 컴파일하기 위한 &lt;b&gt;Makefile&lt;/b&gt;의 내용은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1689139761012&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INC_DIRS	= -I$(SDKTARGETSYSROOT)/usr/include/opencv4

LIB_DIRS	= -L$(SDKTARGETSYSROOT)/usr/lib

LIBS		= -lopencv_core
LIBS		+= -lopencv_videoio
LIBS		+= -lopencv_highgui

all: main.cpp
	$(CXX) $(CXXFLAGS) $(INC_DIRS) $(LIB_DIRS) $(LIBS) main.cpp -g -o opencv-test.bin 
	
clean:
	rm -f opencv-test.bin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;INC_DIRS&lt;/b&gt;&quot;는 추가할 헤더 파일이 존재하는 디렉터리를 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;LIB_DIRS&lt;/b&gt;&quot;는 추가할 라이브러리 파일이 존재하는 디렉터리를 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;LIBS&lt;/b&gt;&quot;는 추가할 라이브러리 파일을 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;.vscode/settings.json&lt;/b&gt;&quot;의 내용은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1689140283052&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
	&quot;OPENCV_APP&quot;: {
		/* 대상 디바이스의 IP 주소 */
		&quot;TARGET_IP&quot;:&quot;192.168.0.16&quot;,

		/* 프로젝트 설정 */
		&quot;PROGRAM&quot;:&quot;opencv-test.bin&quot;,

		/* Yocto SDK Configuration */
		&quot;ARCH&quot;:&quot;aarch64-poky-linux&quot;,
        	&quot;OECORE_NATIVE_SYSROOT&quot;:&quot;/opt/fsl-imx-wayland/6.1-langdale/sysroots/x86_64-pokysdk-linux&quot;,
        	&quot;SDKTARGETSYSROOT&quot;: &quot;/opt/fsl-imx-wayland/6.1-langdale/sysroots/armv8a-poky-linux&quot;,

		/* Yocto SDK Constants */
        	&quot;CC_PREFIX&quot;: &quot;${config:OPENCV_APP.OECORE_NATIVE_SYSROOT}/usr/bin/${config:OPENCV_APP.ARCH}/${config:OPENCV_APP.ARCH}-&quot;,
		&quot;CXX&quot;: &quot;${config:OPENCV_APP.CC_PREFIX}g++ --sysroot=${config:OPENCV_APP.SDKTARGETSYSROOT}&quot;,
		&quot;CC&quot;: &quot;${config:OPENCV_APP.CC_PREFIX}gcc --sysroot=${config:OPENCV_APP.SDKTARGETSYSROOT}&quot;,		
	},
	&quot;files.associations&quot;: {
		&quot;iostream&quot;: &quot;cpp&quot;,
		&quot;ostream&quot;: &quot;cpp&quot;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;.vscode/settings.json&lt;/b&gt;&quot;에는 대상 디바이스에 대한 정보, &lt;b&gt;Yocto SDK&lt;/b&gt;의 &lt;b&gt;toolchain&lt;/b&gt; 정보, 기본적인 컴파일 전역 환경 변수를 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 &lt;b&gt;json&lt;/b&gt; 파일에서 &quot;&lt;b&gt;${config:OPENCV_APP.TARGET_IP}&lt;/b&gt;&quot;와 같은 구문으로 접근할 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 30%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;전역 변수&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 70%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;설명&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;TARGET_IP&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;imx8mp-evk 대상 디바이스의 IP 주소를 설정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;PROGRAM&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;Makefile에서 생성하는 바이너리 이름과 일치해야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;ARCH&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;gcc, g++, gdb 등에서 사용하는 아키텍처 prefix를 설정한다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;OECORE_NATIVE_SYSROOT&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;Yocto SDK가 설치된 경로의 environment-setup-armv8a-poky-linux에 의해 설정되는 OECORE_NATIVE_SYSROOT 환경 변수와 동일하게 설정한다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;SDKTARGETSYSROOT&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;Yocto SDK가 설치된 경로의 environment-setup-armv8a-poky-linux에 의해 설정되는 SDKTARGETROOT 환경 변수와 동일하게 설정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;CC_PREFIX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;toolchain gcc, g++ 등 바이너리에 대한 전체 경로를 설정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;CXX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;크로스 컴파일러 g++ 바이너리와 sysroot의 경로를 설정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;CC&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;크로스 컴파일러 gcc 바이너리와 sysroot의 경로를 설정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;.vscode/tasks.json&lt;/b&gt;&quot;은 세 개의 &lt;b&gt;root&lt;/b&gt; 개체가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;options&lt;/b&gt; : Makefile에서 사용하는 &lt;b&gt;CC&lt;/b&gt;, &lt;b&gt;CXX&lt;/b&gt; 환경 변수를 정의한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;presentation&lt;/b&gt; : 모든 &lt;b&gt;task&lt;/b&gt;에 대한 &lt;b&gt;VSCode&lt;/b&gt;의 통합된 터미널의 동작을 구성한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;tasks&lt;/b&gt; : &lt;b&gt;task&lt;/b&gt; 구성의 나열이다. 아래 내용은 &lt;b&gt;VSCode&lt;/b&gt;의 &quot;&lt;b&gt;Run Build Task...&lt;/b&gt;&quot;가 실행될 때 &lt;b&gt;Makefile&lt;/b&gt;을 실행하는 단일 빌드 작업을 생성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689144190215&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;version&quot;: &quot;2.0.0&quot;,
    /* Configure Yocto SDK Constants from settings.json */
    &quot;options&quot;: {
        &quot;env&quot;: {
            &quot;CXX&quot;: &quot;${config:OPENCV_APP.CXX}&quot;,         /* Used by Makefile */
            &quot;CC&quot;: &quot;${config:OPENCV_APP.CC}&quot;,           /* Used by Makefile */
        }
     },
     /* Configure integrated VS Code Terminal */
     &quot;presentation&quot;: {
        &quot;echo&quot;: false,
        &quot;reveal&quot;: &quot;always&quot;,
        &quot;focus&quot;: true,
        &quot;panel&quot;: &quot;dedicated&quot;,
        &quot;showReuseMessage&quot;: true,
    },
    &quot;tasks&quot;: [        
        /* Configure Build Task */
        {
            &quot;label&quot;: &quot;build&quot;,
            &quot;type&quot;: &quot;shell&quot;,
            &quot;command&quot;: &quot;make clean; make -j$(nproc)&quot;,
            &quot;problemMatcher&quot;: [&quot;$gcc&quot;]
        },
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;.vscode/c_cpp_properties.json&lt;/b&gt;&quot;은 &lt;b&gt;IntelliSense&lt;/b&gt;에 대한 포함 경로를 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1689144351711&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;configurations&quot;: [
        {
            &quot;name&quot;: &quot;Linux&quot;,
            &quot;includePath&quot;: [
                &quot;${workspaceFolder}/**&quot;,
                &quot;${config:OPENCV_APP.SDKTARGETSYSROOT}/usr/include/**&quot;
            ]
        }
    ],
    &quot;version&quot;: 4
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 빌드하기 전에 &lt;b&gt;Yocto SDK&lt;/b&gt;가 설치된 경로의 &quot;&lt;b&gt;environment-setup-armv8a-poky-linux&lt;/b&gt;&quot;를 실행해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 실행한다. 경로는 설치 위치에 따라 달라진다.&lt;/p&gt;
&lt;pre id=&quot;code_1689144531239&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ source /opt/fsl-imx-wayland/6.1-langdale/environment-setup-armv8a-poky-linux
$ export LDFLAGS=&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VSCode&lt;/b&gt;에서 프로젝트를 빌드하려면, &quot;&lt;b&gt;Terminal-&amp;gt;Run Build Task...&lt;/b&gt;&quot;를 실행하거나 &quot;&lt;b&gt;Ctrl + Shift + B&lt;/b&gt;&quot; 단축키를 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vscode_02.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TmgD1/btsng8wbjG3/Yq3QUDz4QaV8nu3YXHPNT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TmgD1/btsng8wbjG3/Yq3QUDz4QaV8nu3YXHPNT1/img.png&quot; data-alt=&quot;빌드 후 화면 (opencv-test.bin 파일이 생성됨)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TmgD1/btsng8wbjG3/Yq3QUDz4QaV8nu3YXHPNT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTmgD1%2Fbtsng8wbjG3%2FYq3QUDz4QaV8nu3YXHPNT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1094&quot; height=&quot;678&quot; data-filename=&quot;vscode_02.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빌드 후 화면 (opencv-test.bin 파일이 생성됨)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 바이너리를 대상 디바이스에 배포하기 위해, &quot;&lt;b&gt;Terminal-&amp;gt;New Terminal&lt;/b&gt;&quot;을 실행하거나 &quot;&lt;b&gt;Ctrl + Shift + `&lt;/b&gt;&quot; 단축키를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널이 실행되면 아래와 같이 &lt;b&gt;scp&lt;/b&gt; 커맨드로 생성된 바이너리를 대상 디바이스에 배포한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689145042711&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ scp opencv-test.bin root@192.168.0.16:/home/root&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IP&lt;/b&gt; 주소는 &quot;&lt;b&gt;.vscode/settings.json&lt;/b&gt;&quot;의 &lt;b&gt;TARGET_IP&lt;/b&gt;와 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상 디바이스의 터미널에서 배포한 바이너리를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689145224181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ./opencv-test.bin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;VSCode를 사용한 원격 디버깅&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VSCode&lt;/b&gt;에서 디버깅을 활성화하기 위해서 &quot;&lt;b&gt;.vscode/tasks.json&lt;/b&gt;&quot; 파일의 수정과 &quot;&lt;b&gt;deploy_gdb.sh&lt;/b&gt;&quot;, &quot;&lt;b&gt;.vscode/launch.json&lt;/b&gt;&quot; 파일들이 추가적으로 필요하다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 38px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;th style=&quot;width: 30%; height: 21px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;파일 및 경로&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 70%; height: 21px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;설명&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30%; height: 17px;&quot;&gt;&lt;b&gt;deploy-gdb.sh&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%; height: 17px;&quot;&gt;gdbserver를 배포하고 실행하는 일반 스크립트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;.vscode/launch.json&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;디버그 구성을 설정하는 VSCode 파일. tasks.json에서 deploy-gdb를 실행.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;.vscode/tasks.json&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;디버깅하기 전에 deploy-gdb.sh를 호출하도록 편집.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;deploy-gdb.sh 파일 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 프로그램 배포를 위한 일반 스크립트를 추가하고 &lt;b&gt;gdbserver&lt;/b&gt;를 실행한다. 스크립트에는 두 가지 인수가 필요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TARGET_IP&lt;/b&gt; : 대상 디바이스의 IP 주소&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PROGRAM&lt;/b&gt; : 바이너리 실행 파일의 이름(여기서는 &lt;b&gt;opencv-test.bin&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 &lt;b&gt;tasks.json&lt;/b&gt;은 각 디버그 세션이 시작될 때 이 스크립트를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 &quot;&lt;b&gt;deploy-gdb.sh&lt;/b&gt;&quot;의 내용이다.&lt;/p&gt;
&lt;pre id=&quot;code_1689211243173&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
readonly TARGET_IP=&quot;$1&quot;
readonly PROGRAM=&quot;$2&quot;
readonly TARGET_DIR=&quot;/home/root&quot;


# Must match startsPattern in tasks.json
echo &quot;Deploying to target&quot;

# kill gdbserver on target and delete old binary
 ssh root@${TARGET_IP} &quot;sh -c '/usr/bin/killall -q gdbserver; rm -rf ${TARGET_DIR}/${PROGRAM}  exit 0'&quot;

# send the program to the target
 scp ${PROGRAM} root@${TARGET_IP}:${TARGET_DIR}

# Must match endsPattern in tasks.json
echo &quot;Starting GDB Server on Target&quot;

# start gdbserver on target
 ssh -t root@${TARGET_IP} &quot;sh -c 'cd ${TARGET_DIR}; gdbserver localhost:3000 ${PROGRAM}'&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.vscode/launch.json 파일 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VSCode&lt;/b&gt;에는 다양한 프로그램 언어를 디버깅할 수 있는 강력한 디버거가 내장되어 있다. 여기서는 &lt;b&gt;C/C++ Extension&lt;/b&gt;을 사용하여 디버깅을 구성을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 &quot;&lt;b&gt;.vscode/launch.json&lt;/b&gt;&quot;의 내용이다.&lt;/p&gt;
&lt;pre id=&quot;code_1689211530956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;version&quot;: &quot;0.2.0&quot;,
    &quot;configurations&quot;: [        
        {
        &quot;name&quot;: &quot;GDB debug&quot;,
        &quot;type&quot;: &quot;cppdbg&quot;,
        &quot;request&quot;: &quot;launch&quot;,
        &quot;program&quot;: &quot;${config:OPENCV_APP.PROGRAM}&quot;,
        &quot;args&quot;: [],
        &quot;stopAtEntry&quot;: true,
        &quot;cwd&quot;: &quot;${workspaceFolder}&quot;,
        &quot;environment&quot;: [],
        &quot;console&quot;: &quot;integratedTerminal&quot;,
        &quot;MIMode&quot;: &quot;gdb&quot;,
        &quot;targetArchitecture&quot;: &quot;arm64&quot;,
        &quot;preLaunchTask&quot;: &quot;deploy-gdb&quot;,
        &quot;setupCommands&quot;: [{
            &quot;description&quot;: &quot;Enable pretty-printing for gdb&quot;,
            &quot;text&quot;: &quot;-enable-pretty-printing&quot;,
            &quot;ignoreFailures&quot;: true
        }],
        &quot;miDebuggerPath&quot;: &quot;/usr/bin/gdb-multiarch&quot;,
        &quot;miDebuggerServerAddress&quot;: &quot;${config:OPENCV_APP.TARGET_IP}:3000&quot;,
    }]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 변수에 대한 세부 정보는 아래 테이블을 참조한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 78px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;th style=&quot;width: 30%; height: 21px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;변수&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 70%; height: 21px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;설명&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 30%; height: 20px;&quot;&gt;&lt;b&gt;miDebuggerServerAddress&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%; height: 20px;&quot;&gt;대상 디바이스의 IP 주소와 일치해야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 30%; height: 20px;&quot;&gt;&lt;b&gt;program&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%; height: 20px;&quot;&gt;Makefile에서 생성한 바이너리의 이름과 일치해야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30%; height: 17px;&quot;&gt;&lt;b&gt;preLaunchTask&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%; height: 17px;&quot;&gt;.vscode/tasks.json의 다음 단계의 task 이름과 일치해야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.vscode/tasks.json 파일 편집&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;.vscode/launch.json&lt;/b&gt;&quot;에서는 각 디버깅 세션의 시작부분에서&amp;nbsp;&lt;b&gt;deploy-gdb&lt;/b&gt; 이름의 &lt;b&gt;task&lt;/b&gt;를 실행하기 위해 &lt;b&gt;preLaunchTask&lt;/b&gt;를 만들었다. 이 &lt;b&gt;task&lt;/b&gt;는 &quot;&lt;b&gt;.vscode/tasks.json&lt;/b&gt;&quot;에서 새로운 &lt;b&gt;task&lt;/b&gt;인 &lt;b&gt;deploy-gdb&lt;/b&gt; 추가하여 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 최종 &quot;&lt;b&gt;.vscode/tasks.json&lt;/b&gt;&quot; 파일의 내용이다.&lt;/p&gt;
&lt;pre id=&quot;code_1689212297669&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;version&quot;: &quot;2.0.0&quot;,
    /* Configure Yocto SDK Constants from settings.json */
    &quot;options&quot;: {
        &quot;env&quot;: {
            &quot;CXX&quot;: &quot;${config:OPENCV_APP.CXX}&quot;,         /* Used by Makefile */
            &quot;CC&quot;: &quot;${config:OPENCV_APP.CC}&quot;,           /* Used by Makefile */
        }
     },
     /* Configure integrated VS Code Terminal */
     &quot;presentation&quot;: {
        &quot;echo&quot;: false,
        &quot;reveal&quot;: &quot;always&quot;,
        &quot;focus&quot;: true,
        &quot;panel&quot;: &quot;dedicated&quot;,
        &quot;showReuseMessage&quot;: true,
    },
    &quot;tasks&quot;: [
        /* Configure launch.json (debug) preLaunchTask Task */
        {
            &quot;label&quot;: &quot;deploy-gdb&quot;,
            &quot;isBackground&quot;: true,
            &quot;problemMatcher&quot;:{
                &quot;base&quot;: &quot;$gcc&quot;,
                &quot;background&quot;: {
                    &quot;activeOnStart&quot;: true,
                    &quot;beginsPattern&quot;:  &quot;Deploying to target&quot;,
                    &quot;endsPattern&quot;:  &quot;Starting GDB Server on Target&quot;
                }
            },
            &quot;type&quot;: &quot;shell&quot;,
            &quot;command&quot;: &quot;sh&quot;,
            &quot;args&quot;: [
                &quot;deploy-gdb.sh&quot;,
                &quot;${config:OPENCV_APP.TARGET_IP}&quot;,
                &quot;${config:OPENCV_APP.PROGRAM}&quot;
            ],
            &quot;dependsOn&quot;: [&quot;build&quot;],
        },
        /* Configure Build Task */
        {
            &quot;label&quot;: &quot;build&quot;,
            &quot;type&quot;: &quot;shell&quot;,
            &quot;command&quot;: &quot;make clean; make -j$(nproc)&quot;,
            &quot;problemMatcher&quot;: [&quot;$gcc&quot;]
        },
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 테이블은 &lt;b&gt;deploy-gdb&lt;/b&gt; 구성을 설명한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 30%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;변수&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 70%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;설명&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;label&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;.vscode/launch.json의 preLaunchTask와 일치해야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;type&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;이 task는 shell을 실행한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;&lt;b&gt;command&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;&quot;deploy-gdb.sh 192.168.0.16 opencv-test.bin&quot; 인수로 sh를 실행한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;디버깅 세션 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 단계를 수행하면 아래와 같은 파일들이 있어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vscode_03.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buM2mb/btsnkL8KMQF/fEspM1QsFvTRig4bOuMjj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buM2mb/btsnkL8KMQF/fEspM1QsFvTRig4bOuMjj0/img.png&quot; data-alt=&quot;최종 파일 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buM2mb/btsnkL8KMQF/fEspM1QsFvTRig4bOuMjj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuM2mb%2FbtsnkL8KMQF%2FfEspM1QsFvTRig4bOuMjj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1108&quot; height=&quot;685&quot; data-filename=&quot;vscode_03.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최종 파일 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;Run-&amp;gt;Start Debugging&lt;/b&gt;&quot;을 선택하거나 &quot;&lt;b&gt;F5&lt;/b&gt;&quot;를 눌러서 새로운 디버깅 세션을 시작할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VSCode&lt;/b&gt;는 디버그 모드로 전환하고 대상 디바이스에서 &lt;b&gt;gdbserver&lt;/b&gt;를 실행하는 &lt;b&gt;gnome-terminal&lt;/b&gt;을 실행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vscode_04.png&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cftqPn/btsnocEUl1d/kh96zBaPEhTkCoViPp8dR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cftqPn/btsnocEUl1d/kh96zBaPEhTkCoViPp8dR1/img.png&quot; data-alt=&quot;VSCode 디버그 모드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cftqPn/btsnocEUl1d/kh96zBaPEhTkCoViPp8dR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcftqPn%2FbtsnocEUl1d%2Fkh96zBaPEhTkCoViPp8dR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1073&quot; height=&quot;685&quot; data-filename=&quot;vscode_04.png&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VSCode 디버그 모드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자 정의 디바이스 트리 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본으로 제공되는 디바이스 트리를 사용하지 않고, 사용자 정의된 디바이스 트리를 사용하는 경우 아래의 절차를 따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;imx8mp_evk&lt;/b&gt;를 기준으로 설명한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기본으로 제공되는 디바이스 트리를 참고하여, 사용자 정의 디바이스 트리를 작성한다.&lt;br /&gt;&lt;b&gt;Yocto Project&lt;/b&gt;의 &quot;&lt;b&gt;&amp;lt;build-dir&amp;gt;/&amp;lt;work-shared&amp;gt;/&amp;lt;machine&amp;gt;/kernel-source/arch/arm64/boot/dts/freescale/&lt;/b&gt;&quot;에서 기본으로 제공되는 디바이스 트리 파일을 찾을 수 있다.&lt;br /&gt;사용자 정의 디바이스 트리 파일은 작성 후 위와 동일한 디렉터리에 있어야 한다.&lt;/li&gt;
&lt;li&gt;같은 디렉터리에 있는 &lt;b&gt;Makefile&lt;/b&gt;에 사용자 정의 디바이스 트리 파일을 추가한다.&lt;br /&gt;&lt;b&gt;dtb-$(CONFIG_ARCH_MXC) += &amp;lt;사용자 정의 디바이스 트리 파일 이름&amp;gt;.dtb&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&quot;&lt;b&gt;&amp;lt;meta-레이어&amp;gt;/conf/machine/&amp;lt;machine&amp;gt;.conf&lt;/b&gt;&quot; 파일에 사용자 정의 디바이스 트리 파일을 추가한다.&lt;br /&gt;&quot;&lt;b&gt;KERNEL_DEVICETREE += &quot;&amp;lt;사용자 정의 디바이스 트리 파일 이름&amp;gt;.dtb&quot;&lt;/b&gt;&quot;&lt;br /&gt;예로 &lt;b&gt;imx8mp&lt;/b&gt;을 사용하는 경우, &quot;&lt;b&gt;source/meta-imx/meta-bsp/conf/machine/imx8_all.conf&lt;/b&gt;&quot;에&amp;nbsp; 추가한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;u-boot&lt;/b&gt;에서 &lt;b&gt;defconfig&lt;/b&gt; 파일을 수정한다.&lt;br /&gt;&lt;b&gt;Yocto Project&lt;/b&gt;의 &quot;&lt;b&gt;&amp;lt;build-dir&amp;gt;/&amp;lt;work&amp;gt;/&amp;lt;machine&amp;gt;-poky-linux/u-boot-imx/&amp;lt;version&amp;gt;-r0/git/configs/imx8mp_evk_defconfig&lt;/b&gt;&quot; 파일에서 아래 항목을 수정한다.&lt;br /&gt;&lt;b&gt;CONFIG_DEFAULT_DEVICE_TREE=&quot;&amp;lt;사용자 정의 디바이스 트리&amp;gt;&quot;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;CONDIF_DEFAULT_FDT_FILE=&quot;&amp;lt;사용자 정의 디바이스 트리&amp;gt;.dtb&quot;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 절차대로 수정 후 다시 이미지를 빌드한다. &lt;b&gt;u-boot&lt;/b&gt;에서 &lt;b&gt;defconfig&lt;/b&gt;를 수정하지 않으면, 기본 디바이스 트리 파일을 로드하므로 꼭 수정을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Yocto Command 정리&quot; href=&quot;https://devdockr.tistory.com/2371&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [다음]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Evaluation Kit for the i.MX 8M Plus</category>
      <category>i.MX</category>
      <category>i.MX8M Plus</category>
      <category>Yocto 사용자 정의</category>
      <category>개발 환경 구축</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2381</guid>
      <comments>https://devdockr.tistory.com/2381#entry2381comment</comments>
      <pubDate>Wed, 12 Jul 2023 10:06:59 +0900</pubDate>
    </item>
    <item>
      <title>AN13709 - References</title>
      <link>https://devdockr.tistory.com/2380</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Results&quot; href=&quot;https://devdockr.tistory.com/2379&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [다음]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8 References&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;i.MX 8M Nano Applications Processor Reference Manual&lt;/b&gt;&lt;/i&gt; (&lt;a title=&quot;IMX8MNRM&quot; href=&quot;https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-processors/i-mx-8-applications-processors/i-mx-8m-nano-family-arm-cortex-a53-cortex-m7:i.MX8MNANO&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;IMX8MNRM&lt;/a&gt; 문서)&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;U-Boot Falcon Mode&quot; href=&quot;https://bootlin.com/pub/conferences/2021/lee/opdenacker-understanding-u-boot-falcon-mode/opdenacker-understanding-u-boot-falcon-mode.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Presentation: Understanding&amp;nbsp;U-Boot&amp;nbsp;Falcon&amp;nbsp;Mode,&amp;nbsp;Michael&amp;nbsp;Opdenacker,&amp;nbsp;June&amp;nbsp;3rd&amp;nbsp;2021&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;U-Boot&amp;nbsp;Source&amp;nbsp;Code&amp;nbsp;-&amp;nbsp;Falcon&amp;nbsp;README&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Results&quot; href=&quot;https://devdockr.tistory.com/2379&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [다음]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>i.MX8M</category>
      <category>Linux Boot Time Optimizations</category>
      <category>References</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2380</guid>
      <comments>https://devdockr.tistory.com/2380#entry2380comment</comments>
      <pubDate>Tue, 23 May 2023 12:02:15 +0900</pubDate>
    </item>
    <item>
      <title>AN13709 - Results</title>
      <link>https://devdockr.tistory.com/2379</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;User space optimizations&quot; href=&quot;https://devdockr.tistory.com/2378&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;References&quot; href=&quot;https://devdockr.tistory.com/2380&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7 Results&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;Table&amp;nbsp;2.&amp;nbsp;Initial&amp;nbsp;Linux&amp;nbsp;boot&amp;nbsp;time&amp;nbsp;measurements&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 158px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;th style=&quot;width: 10%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;th style=&quot;width: 30%; height: 18px;&quot; colspan=&quot;3&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SPL&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 40%; height: 18px;&quot; colspan=&quot;4&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;U-BOOT&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;KERNEL&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 72px;&quot;&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;No.&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;BOOTROM&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;DDR &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;initialization&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SPL &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;initializations &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;+&amp;nbsp;Load&amp;nbsp;UBoot &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;image&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;U-Boot &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;initializations &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;(init_ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;sequence_f)&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;U-Boot &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;initializations &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;(init_ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;sequence_r)&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Boot &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;sequence&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Kernel &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;image &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;load&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Kernel &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;boot&amp;nbsp;until &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;PSPLASH &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;image&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 72px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Total &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;time&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;(ms)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;260&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;253&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;285&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;594&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;906&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;3651&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;329&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;5768&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;12046&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;299&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;253&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;285&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;594&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;1016&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;3852&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;328&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;5920&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;12547&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;258&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;252&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;284&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;587&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;901&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;3730&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;328&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;5902&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center; height: 17px;&quot;&gt;12242&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;257&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;253&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;284&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;587&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;896&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;3726&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;328&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;5846&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;12177&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;261&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;253&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;284&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;587&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;896&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;3726&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;328&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;5975&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;12310&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;&lt;b&gt;Average &lt;/b&gt;&lt;br /&gt;&lt;b&gt;time &lt;/b&gt;&lt;br /&gt;&lt;b&gt;(ms)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30%; text-align: center;&quot; colspan=&quot;3&quot;&gt;&lt;b&gt;805&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40%; text-align: center;&quot; colspan=&quot;4&quot;&gt;&lt;b&gt;5579&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;&lt;b&gt;5883&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;&lt;b&gt;12264&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;Table&amp;nbsp;3.&amp;nbsp;Optimized&amp;nbsp;Linux&amp;nbsp;boot&amp;nbsp;time&amp;nbsp;measurements&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;th style=&quot;width: 14.2857%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;th style=&quot;width: 57.1428%; height: 18px;&quot; colspan=&quot;4&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SPL&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 14.2857%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;KERNEL&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 14.2857%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;th style=&quot;width: 14.2857%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;No.&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 14.2857%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;BOOTROM&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 14.2857%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;DDR&amp;nbsp;initialization&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 14.2857%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SPL&amp;nbsp;initializations&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 14.2857%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Kernel &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Image&amp;nbsp;Load&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 14.2857%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Kernel&amp;nbsp;Boot&amp;nbsp;Until &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;PSPLASH&amp;nbsp;Image&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 14.2857%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Total &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;time&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px; text-align: center;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px; text-align: center;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px; text-align: center;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px; text-align: center;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px; text-align: center;&quot;&gt;(ms)&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px; text-align: center;&quot;&gt;(ms)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;262&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;252&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;128&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;460&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;2661&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;3763&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;264&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;253&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;130&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;461&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;2772&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center; height: 17px;&quot;&gt;3880&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;249&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;252&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;129&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;460&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;2924&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;4014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;255&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;252&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;129&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;460&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;2717&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;3813&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;253&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;253&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;131&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;461&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;2594&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;3692&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;&lt;b&gt;Average &lt;/b&gt;&lt;br /&gt;&lt;b&gt;time&amp;nbsp;(ms)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.1428%; text-align: center;&quot; colspan=&quot;4&quot;&gt;&lt;b&gt;1099&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;&lt;b&gt;2734&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;&lt;b&gt;3832&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;User space optimizations&quot; href=&quot;https://devdockr.tistory.com/2378&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;References&quot; href=&quot;https://devdockr.tistory.com/2380&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>i.MX8M</category>
      <category>Linux Boot Time Optimizations</category>
      <category>results</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2379</guid>
      <comments>https://devdockr.tistory.com/2379#entry2379comment</comments>
      <pubDate>Tue, 23 May 2023 11:43:45 +0900</pubDate>
    </item>
    <item>
      <title>AN13709 - User space optimizations</title>
      <link>https://devdockr.tistory.com/2378</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Kernel space optimizations&quot; href=&quot;https://devdockr.tistory.com/2377&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Results&quot; href=&quot;https://devdockr.tistory.com/2379&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6 User&amp;nbsp;space&amp;nbsp;optimizations&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 공간에서 소비되는 시간을 줄이는 가장 쉬운 방법은 애플리케이션이 실행되는 순서를 재정렬하는 것이다. &lt;i&gt;&lt;b&gt;psplash&lt;/b&gt;&lt;/i&gt; 서비스를 더 빨리 시작하려면, &lt;i&gt;&lt;b&gt;Systemd&lt;/b&gt;&lt;/i&gt;가 작동하는 종속성을 변경해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보드에서 &lt;i&gt;&lt;b&gt;/lib/systemd/system/psplash-start.service&lt;/b&gt;&lt;/i&gt; 파일을 열고, &lt;i&gt;&lt;b&gt;psplash&lt;/b&gt;&lt;/i&gt;가 &lt;i&gt;&lt;b&gt;local-fs-pre.target&lt;/b&gt;&lt;/i&gt;보다 먼저 시작되도록 수정하여 디바이스 종속성을 변경한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684809287667&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Unit]
Description=Start Psplash Boot Screen
#Wants=systemd-vconsole-setup.service
#After=systemd-vconsole-setup.service systemd-udevtrigger.
service systemd-udevd.service
Before=local-fs-pre.target
DefaultDependencies=no&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;system-analyze 커맨드가 blame 인수와 함께 호출되면, &lt;i&gt;&lt;b&gt;Systemd&lt;/b&gt;&lt;/i&gt;는 서비스와 시작 시간을 출력하는 &lt;a title=&quot;systemd-analyze&quot; href=&quot;https://man7.org/linux/man-pages/man1/systemd-analyze.1.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;systemd-analyze&lt;/a&gt;라는 유틸리티도 제공한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684809459041&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ systemd-analyze blame&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스를 비활성화하려면, &lt;i&gt;&lt;b&gt;systemctl disable&lt;/b&gt;&lt;/i&gt; 커맨드를 사용할 수 있다. 일부 서비스(특히 &lt;i&gt;&lt;b&gt;systemd&lt;/b&gt;&lt;/i&gt;에서 제공하는 서비스)는 비활성화하려면 &lt;i&gt;&lt;b&gt;systemctl mask&lt;/b&gt;&lt;/i&gt; 커맨드가 필요할 수 있다. 그러나 시스템이 제대로 작동하기 위해 서비스에 의존할 수 있으므로 서비스를 비활성화할 때 주의해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Kernel space optimizations&quot; href=&quot;https://devdockr.tistory.com/2377&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Results&quot; href=&quot;https://devdockr.tistory.com/2379&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>i.MX8M</category>
      <category>Linux Boot Time Optimizations</category>
      <category>User space optimizations</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2378</guid>
      <comments>https://devdockr.tistory.com/2378#entry2378comment</comments>
      <pubDate>Tue, 23 May 2023 11:01:50 +0900</pubDate>
    </item>
    <item>
      <title>AN13709 - Kernel space optimizations</title>
      <link>https://devdockr.tistory.com/2377</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Bootloader optimizations&quot; href=&quot;https://devdockr.tistory.com/2376&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;User space optimizations&quot; href=&quot;https://devdockr.tistory.com/2378&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5 Kernel&amp;nbsp;space&amp;nbsp;optimizations&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1 &lt;a name=&quot;1&quot;&gt;&lt;/a&gt;Adding&amp;nbsp;quiet&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kernel 시간을 절반 정도 줄이려면, Kernel &lt;i&gt;&lt;b&gt;bootargs&lt;/b&gt;&lt;/i&gt;에 &lt;i&gt;&lt;b&gt;quiet&lt;/b&gt;&lt;/i&gt; 인수를 추가한다. 이는 Linux 시작 시퀀스 중에 일부 메세지를 표시하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;spl export&lt;/b&gt;&lt;/i&gt; 커맨드를 사용하여, 새로운 &lt;i&gt;&lt;b&gt;bootargs&lt;/b&gt;&lt;/i&gt;로 디바이스 트리를 다시 생성해야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기본 부팅 모드로 재부팅한다.&lt;br /&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/include/configs/imx8mn_evk.h&lt;/b&gt;&lt;/i&gt;에서 &lt;i&gt;&lt;b&gt;CONFIG_SPL_OS_BOOT&lt;/b&gt;&lt;/i&gt;의 정의를 주석 처리한다.&lt;/li&gt;
&lt;li&gt;20단계(&lt;a title=&quot;4.3&quot; href=&quot;https://devdockr.tistory.com/2376#3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4.3 참조&lt;/a&gt;)에서와 같이 부트로더를 다시 컴파일하고 다시 저장한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;U-Boot로 진입하고 &lt;i&gt;&lt;b&gt;quiet&lt;/b&gt;&lt;/i&gt;를 추가하여 &lt;i&gt;&lt;b&gt;bootargs&lt;/b&gt;&lt;/i&gt; 파라미터를 편집한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684804335370&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u-boot=&amp;gt; edit bootargs
edit: console=ttymxc1,115200 root=/dev/mmcblk1p2 rootwait rw quiet
u-boot=&amp;gt; saveenv
Saving Environment to MMC... Writing to MMC(1)... OK&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;3&quot;&gt;18단계(&lt;a title=&quot;4.3&quot; href=&quot;https://devdockr.tistory.com/2376#3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4.3 참조&lt;/a&gt;)에서와 같이 디바이스 트리를 다시 생성하고 SDHC에 로드한다.&lt;/li&gt;
&lt;li value=&quot;4&quot;&gt;19단계, 20단계(&lt;a title=&quot;4.3&quot; href=&quot;https://devdockr.tistory.com/2376#3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4.3 참조&lt;/a&gt;)를 수행하여 Falcon 모드로 다시 진입한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2 &lt;a name=&quot;2&quot;&gt;&lt;/a&gt;Removing&amp;nbsp;unnecessary&amp;nbsp;drivers&amp;nbsp;and&amp;nbsp;file&amp;nbsp;systems&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 용도에 따라 불필요한 드라이버와 파일 시스템을 제거하여 Kernel을 줄일 수 있다. 초기화 중에 커널에서 발생하는 일을 그래프로 표시할 수 있는 커널 기능인 &lt;i&gt;&lt;b&gt;bootgraph&lt;/b&gt;&lt;/i&gt;를 사용하여 부팅 중에 커널 기능을 분석할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;bootgraph&lt;/b&gt;&lt;/i&gt;를 생성하려면 다음 단계를 수행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Kernel &lt;i&gt;&lt;b&gt;bootargs&lt;/b&gt;&lt;/i&gt;에 &lt;i&gt;&lt;b&gt;initcall_debug&lt;/b&gt;&lt;/i&gt;를 추가한다.&lt;br /&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li&gt;1단계(&lt;a title=&quot;4.3&quot; href=&quot;https://devdockr.tistory.com/2376#3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4.3 참조&lt;/a&gt;)와 같이 기본 부팅 모드로 재부팅한다.&lt;/li&gt;
&lt;li&gt;U-Boot로 진입하고 &lt;i&gt;&lt;b&gt;initcall_debug&lt;/b&gt;&lt;/i&gt;를 추가하여 &lt;i&gt;&lt;b&gt;bootargs&lt;/b&gt;&lt;/i&gt; 파라미터를 편집한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684805619891&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u-boot=&amp;gt; edit bootargs
edit: console=ttymxc1,115200 root=/dev/mmcblk1p2 rootwait rw quiet initcall_debug
u-boot=&amp;gt; saveenv
Saving Environment to MMC... Writing to MMC(1)... OK&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;2&quot;&gt;18단계(&lt;a title=&quot;4.3&quot; href=&quot;https://devdockr.tistory.com/2376#3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4.3 참조&lt;/a&gt;)에서와 같이 디바이스 트리를 다시 생성하고 SDHC에 로드한다.&lt;/li&gt;
&lt;li value=&quot;3&quot;&gt;19단계, 20단계(&lt;a title=&quot;4.3&quot; href=&quot;https://devdockr.tistory.com/2376#3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4.3 참조&lt;/a&gt;)를 수행하여 Falcon 모드로 다시 진입한다.&lt;/li&gt;
&lt;li value=&quot;4&quot;&gt;보드를 부팅하고 Kernel 로그를 가져온다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684805737008&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;root@imx8mn-lpddr4-evk:~# dmesg &amp;gt; boot.log&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;5&quot;&gt;호스트로 돌아가서 다음 커맨드를 사용하여 그래프를 생성한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684805821937&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd &amp;lt;yocto_build_dir&amp;gt;/tmp/work-shared/imx8mn-lpddr4-evk/kernel-source/scripts
$ ./bootgraph.pl boot.log &amp;gt; boot.svg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 것을 얻을 수 있으며, Kernel 부팅 시간이 어떻게 사용되는지 분석할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AN13709_F4.png&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxDJ2I/btsg0NxfHMI/hwvSvnR5iS03tDWQ6bwJpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxDJ2I/btsg0NxfHMI/hwvSvnR5iS03tDWQ6bwJpk/img.png&quot; data-alt=&quot;Figure 4. Function timeline during kernel boot&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxDJ2I/btsg0NxfHMI/hwvSvnR5iS03tDWQ6bwJpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxDJ2I%2Fbtsg0NxfHMI%2FhwvSvnR5iS03tDWQ6bwJpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;94&quot; data-filename=&quot;AN13709_F4.png&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 4. Function timeline during kernel boot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;6&quot;&gt;드라이버 기능을 비활성화하려면, Kernel 구성을 업데이트해야 한다.&lt;br /&gt;예를 들어&amp;nbsp; Kernel(이미지 크기를 줄임)과 UBI 파일 시스템에서 디버그를 비활성화했다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;sources/meta-imx/meta-bsp/recipies-kernel/linux/files&lt;/b&gt;&lt;/i&gt;에서 다음 라인을 포함하는 조각 구성 파일 &lt;i&gt;&lt;b&gt;frag.cfg&lt;/b&gt;&lt;/i&gt;를 만든다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684806717197&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CONFIG_UBIFS_FS is not set
# CONFIG_DEBUG_KERNEL is not set&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li value=&quot;2&quot;&gt;이것을 기본 구성 파일과 병합하려면, 새로운 레시피를 추가해야 한다. &lt;i&gt;&lt;b&gt;sources/meta-imx/meta-bsp/recipies-kernel/linux&lt;/b&gt;&lt;/i&gt;에 &lt;i&gt;&lt;b&gt;linux-imx_5.10.bbappend&lt;/b&gt;&lt;/i&gt;를 생성하고 다음 라인을 추가한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684806877142&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FILESEXTRAPATHS_prepend := &quot;${THISDIR}/files:&quot;
SRC_URI += &quot;file://frag.cfg \
      &quot;
DELTA_KERNEL_DEFCONFIG = &quot;frag.cfg&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li value=&quot;3&quot;&gt;새로운 구성으로 Kernel을 다시 컴파일하고, &lt;i&gt;&lt;b&gt;mkimage&lt;/b&gt;&lt;/i&gt;로 &lt;i&gt;&lt;b&gt;uImage&lt;/b&gt;&lt;/i&gt;를 변환하여 SD에 저장한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684806986099&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake -c cleansstate virtual/kernel
$ bitbake -f -c compile virtual/kernel&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li value=&quot;4&quot;&gt;17단계(&lt;a title=&quot;4.3&quot; href=&quot;https://devdockr.tistory.com/2376#3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4.3 참조&lt;/a&gt;)와 같이 커널 이미지를 &lt;i&gt;&lt;b&gt;uImage&lt;/b&gt;&lt;/i&gt;로 변환한다.&lt;/li&gt;
&lt;li value=&quot;5&quot;&gt;&lt;i&gt;&lt;b&gt;uImage&lt;/b&gt;&lt;/i&gt; Kernel을 SD 카드에 저장한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;저장 장치의 위치는 다를 수 있다. SD 카드 위치를 가리키려면 &lt;b&gt;of&lt;/b&gt; 파라미터를 조정한다.&lt;br /&gt;&lt;/i&gt;&lt;/i&gt;
&lt;pre id=&quot;code_1684807163779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dd if=uImage of=/dev/sdb bs=512 seek=50000100 conv=fsync&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Bootloader optimizations&quot; href=&quot;https://devdockr.tistory.com/2376&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;User space optimizations&quot; href=&quot;https://devdockr.tistory.com/2378&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>i.MX8M</category>
      <category>Kernel space optimizations</category>
      <category>Linux Boot Time Optimizations</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2377</guid>
      <comments>https://devdockr.tistory.com/2377#entry2377comment</comments>
      <pubDate>Mon, 22 May 2023 14:03:35 +0900</pubDate>
    </item>
    <item>
      <title>AN13709 - Bootloader optimizations</title>
      <link>https://devdockr.tistory.com/2376</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Measurements&quot; href=&quot;https://devdockr.tistory.com/2375&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Kernel space optimizations&quot; href=&quot;https://devdockr.tistory.com/2377&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4 Bootloader&amp;nbsp;optimizations&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 &lt;a name=&quot;1&quot;&gt;&lt;/a&gt;Default&amp;nbsp;boot&amp;nbsp;mode&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;Figure 1&lt;/u&gt;은 기본 부팅 순서를 보여준다. 전원을 켜거(power-on)나 재설정(reset)한 후, i.MX8M은 ROM(Read Only Memory)에 저장된 BootROM(the primary program loader:기본 프로그램 로더)을 실행한다. BootROM은 PLL(Phase Locked Loops), 클럭 구성, 메모리 초기화(SRAM)와 같은 기본적인 주변 장치 초기화를 수행하여 SoC(System-on-Chip)를 구성한 다음 부트로더 이미지를 로드할 수 있는 부트 디바이스를 찾는다. U-Boot SPL, ATF, U-Boot 등의 구성 요소가 부트 디바이스에 포함될 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AN13709_F1.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWQgoe/btsfWXWcV5Z/zK94ZFByr4QU01OMbmJ8Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWQgoe/btsfWXWcV5Z/zK94ZFByr4QU01OMbmJ8Xk/img.png&quot; data-alt=&quot;Figure 1. Default boot sequence&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWQgoe/btsfWXWcV5Z/zK94ZFByr4QU01OMbmJ8Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWQgoe%2FbtsfWXWcV5Z%2FzK94ZFByr4QU01OMbmJ8Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;105&quot; data-filename=&quot;AN13709_F1.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 1. Default boot sequence&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 U-Boot 이미지는 내부 SRAM에 맞지 않기 때문에, &lt;b&gt;SPL(Secondary Program Loader)&lt;/b&gt;과 &lt;b&gt;U-Boot&amp;nbsp;proper&lt;/b&gt; 두 부분으로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SPL&lt;/b&gt;은 부트로더의 첫 번째 단계로, U-Boot와 동일한 소스를 공유하지만 SRAM에 맞는 최소한의 코드 세트를 가지는 더 작은 프리로더(pre-loader)이다. SPL은 SRAM에 로드된다. 일부 주변 장치와 가장 중요한 DRAM을 구성하고 초기화한다. 그런 다음 ATF와 U-Boot proper을 DRAM에 로드한다. 마지막 단계는 ATF로 이동하는 것이며, ATF는 다시 U-Boot proper로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 i.MX8* 제품군에 포함된 &lt;b&gt;ATF(Arm Trusted Firmware)&lt;/b&gt;는 Armv8 아키텍처를 위한 신뢰할 수 있는 코드 기반의 레퍼런스를 제공한다. PSCI(Power State Coordination Interface)를 비롯한 다양한 ARM 인터페이스 표준을 구현한다. 바이너리는 일반적으로 부트로더 바이너리에 포함되어 있다. U-Boot의 초기 단계에서 시작된다. ATF가 없으면, 커널은 Secure World 환경에서 실행해야 하는 서비스를 설정할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;U-Boot proper&lt;/b&gt;는 두 번째 단계의 부트로더이다. Linux Kernel을 로드하고 시작하는 유연한 방법을 제공하며 커맨드라인 인터페이스로 보드의 하드웨어와 상호 작용할 수 있는 최소한의 도구 세트를 제공한다. DRAM에서 실행되어 추가적인 하드웨어 디바이스(네트워크, USB, DSI/CSI 등)를 초기화한다. 그런 다음 디바이스 트리(FDT)를 로드하고 준비한다. U-Boot가 처리하는 주요 작업은 커널 이미지 자체를 로드하고 시작하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Linux Kernel&lt;/b&gt;은 DRAM에서 실행되며 시스템을 완전히 장악한다. U-Boot는 이 시점부터 더 이상 시스템을 제어할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 &lt;a name=&quot;2&quot;&gt;&lt;/a&gt;Falcon&amp;nbsp;mode&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Falcon 모드는 U-Boot의 기능으로 SPL에서 Linux 커널을 직접 시작하여 U-Boot 로딩과 초기화를 완전히 건너뛰어 부트로더에서 소요되는 시간을 줄이는 효과가 있어 빠른 부팅을 가능하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;Figure 2&lt;/u&gt;는 Falcon 모드의 부팅 순서를 보여준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AN13709_F2.png&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF9V0j/btsgkZep39D/8G8XNnVMYuKGpBKHLz0kgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF9V0j/btsgkZep39D/8G8XNnVMYuKGpBKHLz0kgK/img.png&quot; data-alt=&quot;Figure 2. Falcon mode boot sequence&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF9V0j/btsgkZep39D/8G8XNnVMYuKGpBKHLz0kgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF9V0j%2FbtsgkZep39D%2F8G8XNnVMYuKGpBKHLz0kgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;40&quot; data-filename=&quot;AN13709_F2.png&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 2. Falcon mode boot sequence&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모드를 구현하려면 다음 작업을 수행해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Falcon에 대한 몇 가지 특정 구성을 활성화한다.&lt;/li&gt;
&lt;li&gt;FDT(Flattened Device Tree)를 미리 준비한다.&lt;/li&gt;
&lt;li&gt;커널로 이동하도록 ATF를 구성한다.&lt;/li&gt;
&lt;li&gt;SD 카드에서 ATF, 커널 이미지와 FDT를 파티션 외부의 로우 섹션에 저장한다.&lt;/li&gt;
&lt;li&gt;SPL을 수정하여 ATF와 커널을 로드한 다음 ATF로 이동한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3 &lt;a name=&quot;3&quot;&gt;&lt;/a&gt;Implementation&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 수정은 Yocto 환경이 설치된 호스트 컴퓨터에서 이루어진다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Windows에서는 &lt;a title=&quot;MSYS2&quot; href=&quot;https://www.msys2.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MSYS2&lt;/a&gt;를 설치하여 dd 커맨드(Linux 용)를 사용할 수 있다. Windows용으로 컴파일된 GNU/Linux Tools이다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;구성 파일에서 SPL BootROM 지원을 제거한다.&lt;br /&gt;&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/configs/imx8mn_evk_defconfig&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684370666793&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CONFIG_SPL_BOOTROM_SUPPORT is not set&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;2&quot;&gt;SD에서 로우 데이터 읽기에 대한 지원을 추가하고, &lt;i&gt;&lt;b&gt;spl export&lt;/b&gt;&lt;/i&gt; 커맨드를 활성화하고, 레거시 이미지에 대한 지원을 추가하여 Falcon 모드에 대한 특정 구성을 만든다.&lt;br /&gt;&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/include/configs/imx8mn_evk.h&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684375657120&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define CONFIG_CMD_SPL 1 // enable spl export command
#define CONFIG_SPL_MMC_SUPPORT 1 // for reading from MMC
#define CONFIG_SPL_LEGACY_IMAGE_SUPPORT 1

/* Falcon Mode */
//#define CONFIG_SPL_OS_BOOT 1 // activate Falcon Mode
 /* (leave this line commented until you finish all the
 configurations) */

// RAM FDT address
#define CONFIG_SYS_SPL_ARGS_ADDR 0x43000000

/* Falcon Mode - MMC support */
#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR 0x2FAF080
#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS 0x58
#define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR 0x2FAF0E4&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;3&quot;&gt;U-Boot 부팅이 첫 번째 선택이 아님을 나타내기 위해 &lt;b&gt;0&lt;/b&gt;을 반환하는 &lt;i&gt;&lt;b&gt;spl_start_uboot()&lt;/b&gt;&lt;/i&gt; 함수를 구현한다.&lt;br /&gt;&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/board/freescale/imx8mn_evk/spl.c&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684375909867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ifdef CONFIG_SPL_OS_BOOT
int spl_start_uboot(void) {
    return 0;
}
#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;4&quot;&gt;else 문(로드에 헤더가 포함된 경우)에서 &lt;i&gt;&lt;b&gt;spl_parse_legacy_header()&lt;/b&gt;&lt;/i&gt; 함수의 Kenel 로드 주소 계산 모드를 수정한다.&lt;br /&gt;&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/common/spl/spl_legacy.c&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684376369171&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;다음 라인을

spl_image-&amp;gt;load_addr = image_get_load(header) - header_size;

아래와 같이 변경한다.

spl_image-&amp;gt;load_addr = image_get_ep(header) - header_size;&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;5&quot;&gt;&lt;i&gt;&lt;b&gt;mmc_load_legacy()&lt;/b&gt;&lt;/i&gt; 함수에서 기존 코드 뒤에 다음 라인을 추가하여 AFT를 로드한다.&lt;br /&gt;&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/common/spl/spl_mmc.c&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684376530956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* existing code */
count = blk_dread(mmc_get_blk_desc(mmc), sector,
 image_size_sectors, (void *)(ulong)spl_image-&amp;gt;load_addr);
/* end of existing code */
unsigned long count1 = blk_dread(mmc_get_blk_desc(mmc), 0x2FBDAE0, 0x71,
 (void*)(ulong)0x00960000); //write ATF from SD to RAM&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;6&quot;&gt;&lt;i&gt;&lt;b&gt;board_init_r()&lt;/b&gt;&lt;/i&gt; 함수에서 ATF로 이동하도록 SPL을 수정한다(Linux 상태로 이동).&lt;br /&gt;&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/common/spl/spl.c&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684376822929&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ifdef CONFIG_SPL_OS_BOOT
       case IH_OS_LINUX:
       debug(&quot;Jumping to Linux\n&quot;);
#if defined(CONFIG_SYS_SPL_ARGS_ADDR)
      spl_fixup_fdt((void *)CONFIG_SYS_SPL_ARGS_ADDR);
#endif
       spl_board_prepare_for_linux();
       typedef void __noreturn (*image_entry_noargs_t)(void);
       image_entry_noargs_t image_entry = (image_entry_noargs_t)0x00960000;
       image_entry();
#endif&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고 :&lt;/b&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;CONFIG_SPL_OS_BOOT&lt;/b&gt;가 정의되면, SPL은 오류를 발생시켜 CPU를 재설정하기 위해&amp;nbsp;&lt;b&gt;dram_init_banksize()&lt;/b&gt; 함수를 호출한다. 이는 &lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/arch/arm/mach-imx/imx8m/soc.c&lt;/b&gt; 소스 파일에서 &lt;b&gt;gd-&amp;gt;bd&lt;/b&gt; 구조체를 사용하기 전에 메모리를 할당하여 피할 수 있는 초기화되지 않은 함수의 사용으로 인해 발생한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1684378817198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gd-&amp;gt;bd = (struct bd_info*)malloc(sizeof(struct bd_info));&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;7&quot;&gt;Ethernet MAC이 PHY와 상호 작용할 수 있는 작동되는 상태로 가져오려면, U-Boot SPL이나 Linux에서 Ethernet PHY를 재설정해야 한다. 다음 지침은 U-Boot SPL에서 PHY를 재설정하는 자세한 방법을 설명한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li&gt;FEC 디바이스에 연결된 핀을 확인한다. 이것은 i.MX8MN EVK 보드의 관련 DTS 파일에 설명되어 있다.&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx&amp;lt;specified_git_folder&amp;gt;/git/arch/arm/dts/imx8mn-evk.dtsi&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/95W7M/btsglNY0kpg/CpR5eIuYKeF3cbBvwRElP1/img.png&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/95W7M/btsglNY0kpg/CpR5eIuYKeF3cbBvwRElP1/img.png&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;388&quot; data-filename=&quot;AN13709_2.png&quot; /&gt;&lt;br /&gt;보드 회로도에 따르면 Ethernet PHY의 리셋 핀은 그룹 4, 핀 22(빨간색으로 표시)에 연결되어 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li value=&quot;2&quot;&gt;파일에 GPIO 그룹과 GPIO 핀 쌍을 포함하는 매크로를 선언한다. 패드를 GPIO로 사용하는 매크로를 추가한다.&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/common/spl/spl.c&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684381182444&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define RESET_ETH_GPIO IMX_GPIO_NR(4,22)
#define USDHC_GPIO_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_DSE1)&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li value=&quot;3&quot;&gt;&lt;i&gt;&lt;b&gt;board_init_r()&lt;/b&gt;&lt;/i&gt; 함수에 다음 라인을 추가하여 Ethernet PHY를 재설정한다.&lt;br /&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/common/spl/spl.c&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684381349939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*reset eth*/
gpio_request(RESET_ETH_GPIO, &quot;reset_eth_gpio&quot;);
gpio_direction_output(RESET_ETH_GPIO, 0);
mdelay(1);
gpio_direction_output(RESET_ETH_GPIO, 1);
mdelay(1);&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;8&quot;&gt;패치를 만들기 전에, 모든 새로운 수정 사항이 올바른지 확인해야 한다. 호스트에서 다음 &lt;i&gt;&lt;b&gt;bitbake&lt;/b&gt;&lt;/i&gt; 커맨드를 사용하여 U-Boot 이미지를 다시 빌드한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684381627673&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake -f -c configure u-boot-imx
$ bitbake -f -c compile u-boot-imx
$ bitbake u-boot-imx imx-boot&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;9&quot;&gt;설정이 완료되면, U-Boot 수정 사항이 포함된 패치를 생성한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684381736154&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git add &amp;ndash;-all
$ git commit &amp;ndash;s
$ git format-patch HEAD~1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 패치를 &lt;i&gt;&lt;b&gt;imx-yocto-bsp/sources/ meta-imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx&lt;/b&gt;&lt;/i&gt; 위치에 복사한 다음, U-Boot에 대한 Yocto 레시피(&lt;i&gt;&lt;b&gt;imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2021.04.bb&lt;/b&gt;&lt;/i&gt;)에서 소스 위치 식별자에 패치 이름을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684383279958&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SRC_URI = &quot;... \
       file://&amp;lt;patch_name&amp;gt;.patch \
      &quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후 패치가 작동하는지 확인하려면, 다음 커맨드를 적용한다. 그러면 파일에 최신 변경 사항이 포함되어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684383403594&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake -f -c cleansstate u-boot-imx
$ bitbake u-boot-imx imx-boot&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;10&quot;&gt;SPL만으로 부트로더 이미지를 생성한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/imx-boot/&amp;lt;specified_git_folder&amp;gt;/git/iMX8M/soc.mak&lt;/b&gt;&lt;/i&gt; 파일에서 새 이미지를 빌드하기 위한 새로운 대상을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보드가 HDMI로 구성되어 있으면, &amp;nbsp;&lt;i&gt;&lt;b&gt;ifeq($(HDMI),yes)&lt;/b&gt;&lt;/i&gt; 조건에서 다음 라인을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684717000484&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flash_evk_falcon: $(MKIMG) signed_hdmi_imx8m.bin u-boot-spl-ddr.bin
        ./mkimage_imx8 -fit -signed_hdmi
 signed_hdmi_imx8m.bin -loader u-boot-spl-ddr.bin
 $(SPL_LOAD_ADDR) -out $(OUTIMG)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않으면, HDMI를 포함하지 않는 새로운 대상을 만들고 구현한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684717063666&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flash_evk_falcon: flash_evk_falcon_no_hdmi

flash_evk_falcon_no_hdmi: $(MKIMG) u-boot-spl-ddr.bin
      ./mkimage_imx8 -version $(VERSION) -loader u-boot-spl-ddr.bin
$(SPL_LOAD_ADDR) -out $(OUTIMG)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;flash.bin&lt;/b&gt;&lt;/i&gt;(imx-boot image)을 다시 생성하려면, &lt;i&gt;&lt;b&gt;make SOC=iMX8MN flash_evk_falcon&lt;/b&gt;&lt;/i&gt;을 실행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;11&quot;&gt;위의 수정 사항을 포함하는 패치를 만든다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684717189825&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git add soc.mak
$ git commit &amp;ndash;s
$ git format-patch HEAD~1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들어진 패치를 &lt;i&gt;&lt;b&gt;~/imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/imx-mkimage/files&lt;/b&gt;&lt;/i&gt;에 복사한 다음, &lt;i&gt;&lt;b&gt;imx-mkimage&lt;/b&gt;&lt;/i&gt;(&lt;i&gt;&lt;b&gt;~/imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/imx-mkimage/imx-mkimage_git.inc&lt;/b&gt;&lt;/i&gt;)에 대한 Yocto 레시피의 소스 위치 식별자에 패치 이름을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684717492156&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SRC_URI = &quot;... \
      file://&amp;lt;patch_name&amp;gt;.patch \
      &quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후 패치가 작동하는지 확인하려면 다음 커맨드를 적용한다. 그러면 파일에 최신 변경 사항이 포함되어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684717579640&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake &amp;ndash;f &amp;ndash;c cleansstate imx-boot
$ bitbake imx-boot
$ make SOC=iMX8MN flash_evk_falcon&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;12&quot;&gt;SD 카드에 부트로더 이미지를 저장한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;저장 장치의 위치는 다를 수 있다. SD 카드 위치를 가리키도록 &lt;b&gt;of&lt;/b&gt; 파라미터를 조정한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1684717713278&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dd if=flash.bin of=/dev/sdb bs=1k seek=32 conv=fsync&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;13&quot;&gt;Kernel 이미지로 이동하도록 ATF를 구성한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;bl31_early_platform_setup2()&lt;/b&gt;&lt;/i&gt; 함수에서 &lt;i&gt;&lt;b&gt;bl33_image_ep_info&lt;/b&gt;&lt;/i&gt; 구조체의 프로그램 카운터 멤버를 커널 주소로 설정하고 FDT의 주소를 인자로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/cortexa53-crypto-mx8mn-poky-linux/imx-atf/&amp;lt;specified_git_folder&amp;gt;/git/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684718205849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET;
bl33_image_ep_info.pc = 0x40400000; // RAM kernel address
bl33_image_ep_info.spsr = get_spsr_for_bl33_entry();
// RAM FDT address
bl33_image_ep_info.args.arg0 = (u_register_t)0x43000000;
bl33_image_ep_info.args.arg1 = 0U;
bl33_image_ep_info.args.arg2 = 0U;
bl33_image_ep_info.args.arg3 = 0U;
SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;14&quot;&gt;ATF 소스를 다시 컴파일한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패치를 만들기 전에 소스가 컴파일되는지 확인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684719355360&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake imx-atf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;build/imx8mn/release&lt;/b&gt;&lt;/i&gt; 디렉토리에서 ATF 바이너리(&lt;i&gt;&lt;b&gt;bl31.bin&lt;/b&gt;&lt;/i&gt;)를 찾을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 수정 사항을 포함하는 패치를 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1684719672031&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git add plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c
$ git commit &amp;ndash;s
$ git format-patch HEAD~1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 패치를 &lt;i&gt;&lt;b&gt;imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/imx-atf/files&lt;/b&gt;&lt;/i&gt;에 복사한다. 기존 레시피에 새로운 레시피를 추가(&lt;i&gt;&lt;b&gt;imx-atf_2.4.bbappend&lt;/b&gt;&lt;/i&gt; 파일 생성)하고 &lt;i&gt;&lt;b&gt;imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/imx-atf/imx-atf_ 2.4.bbappend&lt;/b&gt;&lt;/i&gt;에 다음 라인을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684719971638&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FILESEXTRAPATHS_prepend := &quot;${THISDIR}/files:&quot;
SRC_URI += &quot;file://0001-jump-to-kernel.patch \
      &quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후 패치가 작동하는지 확인하려면, 다음 커맨드를 적용한다. 그러면 파일에 새로운 변경 사항이 포함되어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684720045532&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake &amp;ndash;f &amp;ndash;c cleansstate imx-atf
$ bitbake imx-atf&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;ATF를 수동으로 빌드하려면, &lt;b&gt;Yocto meta-toolchain&lt;/b&gt;을 사용한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1684720150911&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake meta-toolchain
$ cd imx-yocto-bsp/build-wayland/tmp/deploy/sdk
$ ./fsl-imx-wayland-glibc-x86_64-meta-toolchain-cortexa53-
crypto-imx8mn-lpddr4-evk-toolchain-5.10-hardknott.sh
$ source /opt/fsl-imx-wayland/5.10-hardknott/environment-
setup-cortexa53-crypto-poky-linux; unset LDFLAGS
$ cd &amp;lt;yocto_build_dir&amp;gt;/tmp/work/cortexa53-crypto-mx8mn-poky-
linux/imx-atf/&amp;lt;specified_git_folder&amp;gt;/git
$ make PLAT=imx8mn bl31&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;15&quot;&gt;SD 카드에 ATF를 저장한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;저장 장치의 위치는 다를 수 있다. SD 카드 위치를 가리키려면, &lt;b&gt;of&lt;/b&gt; 파라미터를 조정한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1684720276636&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dd if=bl31.bin of=/dev/sdb bs=512 seek=50060000 conv=fsync&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;16&quot;&gt;Kernel 이미지의 진입점(entry point)과 로드 주소를 선택한다.&lt;br /&gt;커널을 부팅하기 전에, U-Boot는 커널 이미지를 2MB의 배수인 주소로 재배치한다. 이 재배치를 우회하려면 동일한 기준을 사용하여 진입점 주소를 미리 설정해야 한다(주소는 2MB의 배수여야 함). 커널이 실행될 주소는 &lt;i&gt;&lt;b&gt;0x40400000&lt;/b&gt;&lt;/i&gt;이다. uImage의 헤더가 64바이트인 것을 고려하면 로드 주소는 &lt;i&gt;&lt;b&gt;0x403fffc0&lt;/b&gt;&lt;/i&gt;이 된다.&lt;/li&gt;
&lt;li value=&quot;17&quot;&gt;이미지에 Kernel 레거시 &lt;i&gt;&lt;b&gt;uImage&lt;/b&gt;&lt;/i&gt; 파일을 빌드한다.&lt;br /&gt;&lt;i&gt;&lt;b&gt;uImage&lt;/b&gt;&lt;/i&gt;는 Image 앞에 로더 정보(로드 주소, 진입점, OS 유형 등)가 지정된 64바이트 헤더를 추가하는 특수 이미지 파일이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li value=&quot;1&quot;&gt;빌드 후 Kernel 이미지가 배포되는 디렉터리를 변경한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684723102116&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd &amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-
linux/linux-imx/&amp;lt;specified_git_folder&amp;gt;/build/arch/arm64/boot&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot; data-ke-list-type=&quot;lower-alpha&quot;&gt;
&lt;li value=&quot;2&quot;&gt;U-Boot의 mkimage 커맨드를 사용하여 uImage를 생성한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684723220541&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkimage -A arm -O linux -T kernel -C none -a 0x403FFFC0
 -e 0x40400000 -n &quot;Linux kernel&quot; -d Image uImage
Image Name:   Linux kernel
Created:      Wed May 4 11:02:52 2022
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    30118400 Bytes = 29412.50 KiB = 28.72 MiB
Load Address: 403fffc0
Entry Point:  40400000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터 정보:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A [&lt;i&gt;architecture&lt;/i&gt;]: 아키텍처 설정&lt;/li&gt;
&lt;li&gt;O [&lt;i&gt;os&lt;/i&gt;]: 운영 체제 설정&lt;/li&gt;
&lt;li&gt;T [&lt;i&gt;image type&lt;/i&gt;]: 이미지 유형 설정&lt;/li&gt;
&lt;li&gt;C [&lt;i&gt;compression type&lt;/i&gt;]: 압축 유형을 설정&lt;/li&gt;
&lt;li&gt;n&amp;nbsp;[&lt;i&gt;image&amp;nbsp;name&lt;/i&gt;]: 이미지 이름을 이미지 이름으로 설정&lt;/li&gt;
&lt;li&gt;d [&lt;i&gt;image data file&lt;/i&gt;]: 이미지 데이터 파일에서 이미지 데이터를 사용&lt;/li&gt;
&lt;li&gt;a [&lt;i&gt;load address&lt;/i&gt;]: 16진수로 로드 주소를 설정&lt;/li&gt;
&lt;li&gt;e [&lt;i&gt;entry point&lt;/i&gt;]: 16진수로 진입점을 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;18&quot;&gt;Flattened Device Tree를 준비하고 SD에 저장한다.&lt;br /&gt;Falcon Mode로 부팅할 때, 중요한 단계는 디바이스 트리를 준비하는 것이다. 일반적으로 U-Boot는 Linux를 부팅할 때 FDT 수정을 수행한다. 이는 초기 디바이스 트리에 U-Boot가 Kernel 인수를 추가함을 의미한다.&lt;br /&gt;이러한 인수는 구성 파일 중 하나인 &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/include/configs/imx8mn_evk.h&lt;/b&gt;&lt;/i&gt;에서 &lt;i&gt;&lt;b&gt;bootargs&lt;/b&gt;&lt;/i&gt;라는 이름 아래에서 찾을 수 있다. 여기에 콘솔 파라미터가 지정되어 있고 루트 파일 시스템을 찾을 위치를 커널에 알려준다.&lt;br /&gt;U-Boot를 스킵하기 위해서, &lt;i&gt;&lt;b&gt;spl export&lt;/b&gt;&lt;/i&gt; 커맨드를 이용하여 FDT를 미리 준비해야 한다. 일반 부팅에서만 호출해야 한다. 디바이스 트리 수정이 완료될 때까지 &lt;i&gt;&lt;b&gt;bootm&lt;/b&gt;&lt;/i&gt;을 통과하는 것과 동일한 커맨드이다. 메모리의 디바이스 트리는 falcon 모드에 필요한 것이다. 이 이미지는 &lt;i&gt;&lt;b&gt;CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR&lt;/b&gt;&lt;/i&gt; 매크로가 지정하는 위치로 SD에 저장해야 하며, 최대 크기는 &lt;i&gt;&lt;b&gt;CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS&lt;/b&gt;&lt;/i&gt; 매크로가 지정한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FDT 준비 단계:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보드를 U-Boot로 부팅하고, 자동 부팅 시퀀스에 들어가기 직전에 중지한다.&lt;/li&gt;
&lt;li&gt;FDT를 RAM에 로드한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1684727925477&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u-boot=&amp;gt; run loadfdt
41608 bytes read in 2 ms (19.8 MiB/s)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kernel uImage를 RAM에 로드한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1684728282242&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u-boot=&amp;gt; fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} uImage
30118464 bytes read in 320 ms (89.8 MiB/s)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정된 오프셋 섹터로 Kernel Image를 SDHC에 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1684729361927&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u-boot=&amp;gt; mmc write ${loadaddr} 0x2FAF0E4 0xe5c9
MMC write: dev # 1, block # 50000100, count 58825 ... 58825
 blocks written: OK&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FDT 준비&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1684729434428&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u-boot=&amp;gt; spl export fdt ${loadaddr} - ${fdt_addr_r}
## Booting kernel from Legacy Image at 40400000 ...
   Image Name: Linux kernel
   Created: 2022-04-08 13:08:28 UTC
   Image Type: ARM Linux Kernel Image (uncompressed)
   Data Size: 30118400 Bytes = 28.7 MiB
   Load Address: 403fffc0
   Entry Point: 40400000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 43000000
   Booting using the fdt blob at 0x43000000
   Loading Kernel Image
   Using Device Tree in place at 0000000043000000, end 000000004300d287
subcommand not supported
subcommand not supported
   Using Device Tree in place at 0000000043000000, end 0000000043010287
Argument image is now in RAM: 0x0000000043000000&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;준비된 FDT를 SD 카드에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1684729472180&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u-boot=&amp;gt; mmc write 0x43000000 0x2FAF080 0x58&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;SD 카드에 FDT를 다시 저장할 수 있다. PC에서 로컬로 저장하려면, 다음 커맨드를 사용한다.&lt;/i&gt;&lt;br /&gt;
&lt;pre id=&quot;code_1684729563741&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dd if=/dev/sdb of=imx8mn-evk.dtb bs=512 skip=50000000 count=88 conv=fsync&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;저장 장치의 위치는 다를 수 있다. SD 카드 위치를 지정하려면, &lt;b&gt;of&lt;/b&gt; 파라미터를 조정한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후 만들어진 SD 카드는 &lt;u&gt;Figure 3&lt;/u&gt;과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AN13709_F3.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ouR4G/btsgEaAr23b/InQ7ILXeEclQIPImYnngwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ouR4G/btsgEaAr23b/InQ7ILXeEclQIPImYnngwk/img.png&quot; data-alt=&quot;Figure 3. SD card structure&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ouR4G/btsgEaAr23b/InQ7ILXeEclQIPImYnngwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FouR4G%2FbtsgEaAr23b%2FInQ7ILXeEclQIPImYnngwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;135&quot; data-filename=&quot;AN13709_F3.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 3. SD card structure&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;19&quot;&gt;2 단계에서의 &lt;i&gt;&lt;b&gt;CONFIG_SPL_OS_BOOT&lt;/b&gt;&lt;/i&gt; 정의의 주석 처리를 제거한다.&lt;/li&gt;
&lt;li value=&quot;20&quot;&gt;부트로더를 다시 컴파일하고 SD 카드에 저장한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1684729917341&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake -f -c configure u-boot-imx
$ bitbake -f -c compile u-boot-imx
$ cd &amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/imx-boot/&amp;lt;specified_git_folder&amp;gt;/git/
$ make SOC=iMX8MN flash_evk_falcon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SD 카드에 U-Boot 이미지를 저장한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;저장 장치의 위치는 다를 수 있다. SD 카드 위치를 지정하려면, &lt;b&gt;of&lt;/b&gt; 파라미터를 조정한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1684730000122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dd if=flash.bin of=/dev/sdb bs=1k seek=32 conv=fsync&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4 &lt;a name=&quot;4&quot;&gt;&lt;/a&gt;Improve&amp;nbsp;raw&amp;nbsp;MMC&amp;nbsp;read&amp;nbsp;performance&amp;nbsp;in&amp;nbsp;SPL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Falcon 모드를 구현한 후 SPL에서 소비되는 시간이 크게 증가한 것을 관찰할 수 있다. 커널 이미지가 메모리에 느리게 로드되기 때문이다(큰 크기 ~ 30MB). SPL에서 전송 속도를 높이려면 고속 지원(UHS/SD)을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치 : &lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/configs/imx8mn_evk_defconfig&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684730306889&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CONFIG_SPL_MMC_UHS_SUPPORT=y
CONFIG_SPL_MMC_IO_VOLTAGE=y&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&amp;lt;yocto_build_dir&amp;gt;/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/&amp;lt;specified_git_folder&amp;gt;/git/Kconfig&lt;/b&gt; 파일에서 사용 가능한 모든 구성을 볼 수 있다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 수정 사항으로 부트로더를 다시 컴파일하고 20단계와 같이 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Measurements&quot; href=&quot;https://devdockr.tistory.com/2375&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Kernel space optimizations&quot; href=&quot;https://devdockr.tistory.com/2377&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>Bootloader optimizations</category>
      <category>i.MX8M</category>
      <category>Linux Boot Time Optimizations</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2376</guid>
      <comments>https://devdockr.tistory.com/2376#entry2376comment</comments>
      <pubDate>Tue, 16 May 2023 10:36:41 +0900</pubDate>
    </item>
    <item>
      <title>AN13709 - Measurements</title>
      <link>https://devdockr.tistory.com/2375</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;General description&quot; href=&quot;https://devdockr.tistory.com/2374&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Bootloader optimizations&quot; href=&quot;https://devdockr.tistory.com/2376&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3 Measurements&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;측정 범위는 보드 POR(Power-On Reset)과 PSPLASH 프로세스 시작 사이로 간주된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 측정에 사용되는 설정은 &lt;b&gt;&lt;a title=&quot;Boot Time Measurements Methodology&quot; href=&quot;https://www.nxp.com/docs/en/application-note/AN13369.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Boot Time Measurements Methodology&lt;/a&gt;&lt;/b&gt; 문서에 설명되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;측정된 간격은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;Table&amp;nbsp;1.&amp;nbsp;Measured&amp;nbsp;intervals&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 257px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;th style=&quot;width: 20%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Time&amp;nbsp;point&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 25%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Interval &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;between&amp;nbsp;pulses&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 30%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Location&amp;nbsp;of&amp;nbsp;the&amp;nbsp;pulse&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 15%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Boot&amp;nbsp;stages&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 10%; height: 36px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 34px;&quot;&gt;BootROM&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 34px;&quot;&gt;nRST -&amp;gt; &lt;br /&gt;before ddr_init()&lt;/td&gt;
&lt;td style=&quot;width: 30%; height: 34px;&quot;&gt;board/freescale/imx8mn_evk/spl.c/board_init_f()&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: center; height: 102px;&quot; rowspan=&quot;3&quot;&gt;SPL&lt;/td&gt;
&lt;td style=&quot;width: 10%; height: 34px;&quot; rowspan=&quot;8&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AN13709_1.png&quot; data-origin-width=&quot;38&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOXktL/btsf0WP2JGl/raccbKKdNKFXUO9sjQfO3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOXktL/btsf0WP2JGl/raccbKKdNKFXUO9sjQfO3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOXktL/btsf0WP2JGl/raccbKKdNKFXUO9sjQfO3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOXktL%2Fbtsf0WP2JGl%2FraccbKKdNKFXUO9sjQfO3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;38&quot; height=&quot;245&quot; data-filename=&quot;AN13709_1.png&quot; data-origin-width=&quot;38&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 34px;&quot;&gt;DDR&amp;nbsp;initialization&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 34px;&quot;&gt;before&amp;nbsp;ddr_init()&amp;nbsp;-&amp;gt; &lt;br /&gt;after&amp;nbsp;ddr_init()&lt;/td&gt;
&lt;td style=&quot;width: 30%; height: 34px;&quot;&gt;board/freescale/imx8mn_evk/spl.c/board_init_f()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 34px;&quot;&gt;SPL initialization + &lt;br /&gt;Load U-Boot&amp;nbsp;image&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 34px;&quot;&gt;after&amp;nbsp;ddr_init()&amp;nbsp;-&amp;gt; &lt;br /&gt;before&amp;nbsp;image_entry()&lt;/td&gt;
&lt;td style=&quot;width: 30%; height: 34px;&quot;&gt;common/spl/spl.c/jump_to_image_no_args()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 34px;&quot;&gt;U-Boot&amp;nbsp;initializations &lt;br /&gt;(init_sequence_f)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 34px;&quot;&gt;before image_entry() -&amp;gt; &lt;br /&gt;start init_sequence_r&lt;/td&gt;
&lt;td style=&quot;width: 30%; height: 34px;&quot;&gt;common/board_r.c/board_init_r()&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: center; height: 34px;&quot; rowspan=&quot;4&quot;&gt;U-BOOT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 34px;&quot;&gt;U-Boot&amp;nbsp;initializations &lt;br /&gt;(init_sequence_r)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 34px;&quot;&gt;start init_sequence_r -&amp;gt;&amp;nbsp;&lt;br /&gt;u-boot&amp;nbsp;main_loop&lt;/td&gt;
&lt;td style=&quot;width: 30%; height: 34px;&quot;&gt;common/main.c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 34px;&quot;&gt;Boot&amp;nbsp;sequence&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 34px;&quot;&gt;u-boot&amp;nbsp;main_loop&amp;nbsp;-&amp;gt; &lt;br /&gt;before&amp;nbsp;load_image&lt;/td&gt;
&lt;td style=&quot;width: 30%; height: 34px;&quot;&gt;include/configs/imx8mn_evk.h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;Kernel&amp;nbsp;Image&amp;nbsp;Load&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;before&amp;nbsp;loadimage&amp;nbsp;-&amp;gt; &lt;br /&gt;after&amp;nbsp;loadimage&lt;/td&gt;
&lt;td style=&quot;width: 30%; height: 17px;&quot;&gt;include/configs/imx8mn_evk.h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;Kernel&amp;nbsp;Boot&amp;nbsp;Until &lt;br /&gt;PSPLASH&amp;nbsp;Image&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;after&amp;nbsp;loadimage&amp;nbsp;-&amp;gt; &lt;br /&gt;psplash&lt;/td&gt;
&lt;td style=&quot;width: 30%;&quot;&gt;psplash.c&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: center;&quot;&gt;Kernel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;General description&quot; href=&quot;https://devdockr.tistory.com/2374&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Bootloader optimizations&quot; href=&quot;https://devdockr.tistory.com/2376&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>i.MX8M</category>
      <category>Linux Boot Time Optimizations</category>
      <category>measurements</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2375</guid>
      <comments>https://devdockr.tistory.com/2375#entry2375comment</comments>
      <pubDate>Tue, 16 May 2023 09:19:45 +0900</pubDate>
    </item>
    <item>
      <title>AN13709 - General description</title>
      <link>https://devdockr.tistory.com/2374</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Introduction&quot; href=&quot;https://devdockr.tistory.com/2373&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Measurements&quot; href=&quot;https://devdockr.tistory.com/2375&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2 General&amp;nbsp;description&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션에서는 부팅 시간을 단축하기 위해 수행할 수 있는 일반적인 수정 방법에 대한 개요를 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 &lt;a name=&quot;1&quot;&gt;&lt;/a&gt;Reducing&amp;nbsp;bootloader&amp;nbsp;time&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;부트 지연 제거&lt;/b&gt; : 최소한의 변경으로 기본 구성에 비해 약 2초가 절약된다. 이로 인해 U-Boot는 부팅 중 키 입력 단계를 건너뛴다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Falcon Mode 구현&lt;/b&gt; : 기본 구성에 비해 약 4초가 절약된다. 전체 U-Boot를 건너뛰고 커널을 직접 로드할 수 있는 U-Boot의 일부인 SPL(Second Program Loader)을 활성화한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 &lt;a name=&quot;2&quot;&gt;&lt;/a&gt;Reducing&amp;nbsp;Linux&amp;nbsp;kernel&amp;nbsp;boot&amp;nbsp;time&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;콘솔 메세지 줄이기&lt;/b&gt; : 약 3초가 절약된다. 커널 명령줄에 &lt;i&gt;&lt;b&gt;quiet&lt;/b&gt;&lt;/i&gt;를 추가한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;드라이버와 파일 시스템을 제거하여 커널 슬림화&lt;/b&gt; : 기본적으로 커널 이미지에는 보드에서 지원되는 대부분의 기능을 활성화하기 위해 많은 드라이버와 파일 시스템(예: UBIFS)이 포함되어 있다. 포함된 드라이버와 파일 시스템 목록은 사용 사례에 따라 다듬을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 &lt;a name=&quot;3&quot;&gt;&lt;/a&gt;Reducing&amp;nbsp;user-space&amp;nbsp;boot&amp;nbsp;time&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Systemd 스크립트 초기화에서 실행 순서 변경&lt;/b&gt; : 약 600ms를 절약한다. 종속성을 고려하여, 가능한 한 빨리 PSPLASH 프로세스를 시작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Introduction&quot; href=&quot;https://devdockr.tistory.com/2373&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Measurements&quot; href=&quot;https://devdockr.tistory.com/2375&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>General description</category>
      <category>i.MX8M</category>
      <category>Linux Boot Time Optimizations</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2374</guid>
      <comments>https://devdockr.tistory.com/2374#entry2374comment</comments>
      <pubDate>Mon, 15 May 2023 13:55:45 +0900</pubDate>
    </item>
    <item>
      <title>AN13709 - Introduction</title>
      <link>https://devdockr.tistory.com/2373</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[이전] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;General description&quot; href=&quot;https://devdockr.tistory.com/2374&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1 Introduction&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서는 i.MX8M Nano 보드의 Linux 부팅 시간을 줄이는 방법을 안내한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;동일한 워크플로가 전체 &lt;b&gt;i.MX8M&lt;/b&gt; 제품군에 적용되지만, 각 SoC에 대한 특정 코드의 업데이트가 필요할 수 있다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서의 목적은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 부팅 시간 측정과 평가&lt;/li&gt;
&lt;li&gt;Bootloader 최적화&lt;/li&gt;
&lt;li&gt;Linux Kernel와 User Space 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 &lt;a name=&quot;1&quot;&gt;&lt;/a&gt;Software&amp;nbsp;environment&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux BSP 릴리스 &lt;a title=&quot;Embedded Linux for i.MX Applications Processors&quot; href=&quot;https://www.nxp.com/design/software/embedded-software/i-mx-software/embedded-linux-for-i-mx-applications-processors:IMXLINUX&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;5.10.72-2.2.0&lt;/a&gt;이 최적화 프로세스에 사용된다. &lt;i&gt;&lt;b&gt;imx-image-core&lt;/b&gt;&lt;/i&gt; Yocto 이미지는 실험 중에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 &lt;a name=&quot;2&quot;&gt;&lt;/a&gt;Hardware&amp;nbsp;setup&amp;nbsp;and&amp;nbsp;equipment&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a title=&quot;Evaluation Kit for the i.MX 8M Nano Applications Processor&quot; href=&quot;https://www.nxp.com/design/development-boards/i-mx-evaluation-and-development-boards/evaluation-kit-for-the-i-mx-8m-nano-applications-processor:8MNANOD4-EVK&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;NXP i.MX 8MN EVK LPDDR4&lt;/a&gt; 개발 키트&lt;/li&gt;
&lt;li&gt;Micro SD 카드: SanDisk Ultra 32GB Micro SDHC I Class 10이 실험에 사용되었다.&lt;/li&gt;
&lt;li&gt;디버그 포트용 Micro-USB&lt;/li&gt;
&lt;li&gt;시간 측정을 위한 최소 요구 사항은 4채널 10MS/s의 로직 분석기이다. Saleae Logic 8이 실험에 사용되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[이전] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2372&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;General description&quot; href=&quot;https://devdockr.tistory.com/2374&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>i.MX8M</category>
      <category>Introduction</category>
      <category>Linux Boot Time Optimizations</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2373</guid>
      <comments>https://devdockr.tistory.com/2373#entry2373comment</comments>
      <pubDate>Mon, 15 May 2023 13:01:06 +0900</pubDate>
    </item>
    <item>
      <title>Linux Boot Time Optimizations for i.MX8M Family (AN13709)</title>
      <link>https://devdockr.tistory.com/2372</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문서 정보&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;th style=&quot;width: 25%; height: 17px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Information&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 75%; height: 17px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Content&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;Keywords&lt;/td&gt;
&lt;td style=&quot;width: 75%; height: 17px;&quot;&gt;i.MX8MN,&amp;nbsp;Reduce&amp;nbsp;Boot&amp;nbsp;Time,&amp;nbsp;Linux,&amp;nbsp;Falcon&amp;nbsp;Mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Abstract&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;이 문서는 i.MX8M Nano 보드의 Linux 부팅 시간을 줄이는 방법을 안내한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rev.&amp;nbsp;0&amp;nbsp;&amp;mdash;&amp;nbsp;18&amp;nbsp;August&amp;nbsp;2022&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;목차 (Contents)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;a title=&quot;Introduction&quot; href=&quot;https://devdockr.tistory.com/2373&quot;&gt;Introduction&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;1.1&quot;&gt;1 &lt;a title=&quot;1.1&quot; href=&quot;https://devdockr.tistory.com/2373#1&quot;&gt;Software&amp;nbsp;environment&lt;/a&gt;&lt;/li&gt;
&lt;li value=&quot;1.2&quot;&gt;2 &lt;a title=&quot;1.2&quot; href=&quot;https://devdockr.tistory.com/2373#2&quot;&gt;Hardware&amp;nbsp;setup&amp;nbsp;and&amp;nbsp;equipment&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a title=&quot;General description&quot; href=&quot;https://devdockr.tistory.com/2374&quot;&gt;General&amp;nbsp;description&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;2.1&quot;&gt;1 &lt;a title=&quot;2.1&quot; href=&quot;https://devdockr.tistory.com/2374#1&quot;&gt;Reducing&amp;nbsp;bootloader&amp;nbsp;time&lt;/a&gt;&lt;/li&gt;
&lt;li value=&quot;2.2&quot;&gt;2 &lt;a title=&quot;2.2&quot; href=&quot;https://devdockr.tistory.com/2374#2&quot;&gt;Reducing&amp;nbsp;Linux&amp;nbsp;kernel&amp;nbsp;boot&amp;nbsp;time&lt;/a&gt;&lt;/li&gt;
&lt;li value=&quot;2.3&quot;&gt;3 &lt;a title=&quot;2.3&quot; href=&quot;https://devdockr.tistory.com/2374#3&quot;&gt;Reducing&amp;nbsp;user-space&amp;nbsp;boot&amp;nbsp;time&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a title=&quot;Measurements&quot; href=&quot;https://devdockr.tistory.com/2375&quot;&gt;Measurements&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a title=&quot;Bootloader optimizations&quot; href=&quot;https://devdockr.tistory.com/2376&quot;&gt;Bootloader&amp;nbsp;optimizations&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;4.1&quot;&gt;1 &lt;a title=&quot;4.1&quot; href=&quot;https://devdockr.tistory.com/2376#1&quot;&gt;Default&amp;nbsp;boot&amp;nbsp;mode&lt;/a&gt;&lt;/li&gt;
&lt;li value=&quot;4.2&quot;&gt;2 &lt;a title=&quot;4.2&quot; href=&quot;https://devdockr.tistory.com/2376#2&quot;&gt;Falcon&amp;nbsp;mode&lt;/a&gt;&lt;/li&gt;
&lt;li value=&quot;4.3&quot;&gt;3 &lt;a title=&quot;4.3&quot; href=&quot;https://devdockr.tistory.com/2376#3&quot;&gt;Implementation&lt;/a&gt;&lt;/li&gt;
&lt;li value=&quot;4.4&quot;&gt;4 &lt;a title=&quot;4.4&quot; href=&quot;https://devdockr.tistory.com/2376#4&quot;&gt;Improve&amp;nbsp;raw&amp;nbsp;MMC&amp;nbsp;read&amp;nbsp;performance&amp;nbsp;in&amp;nbsp;SPL&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a title=&quot;Kernel space optimizations&quot; href=&quot;https://devdockr.tistory.com/2377&quot;&gt;Kernel&amp;nbsp;space&amp;nbsp;optimizations&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li value=&quot;5.1&quot;&gt;1 &lt;a title=&quot;5.1&quot; href=&quot;https://devdockr.tistory.com/2377#1&quot;&gt;Adding&amp;nbsp;quiet&lt;/a&gt;&lt;/li&gt;
&lt;li value=&quot;5.2&quot;&gt;2 &lt;a title=&quot;5.2&quot; href=&quot;https://devdockr.tistory.com/2377#2&quot;&gt;Removing&amp;nbsp;unnecessary&amp;nbsp;drivers&amp;nbsp;and&amp;nbsp;file&amp;nbsp;systems&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a title=&quot;User space optimizations&quot; href=&quot;https://devdockr.tistory.com/2378&quot;&gt;User&amp;nbsp;space&amp;nbsp;optimizations&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a title=&quot;Results&quot; href=&quot;https://devdockr.tistory.com/2379&quot;&gt;Results&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a title=&quot;References&quot; href=&quot;https://devdockr.tistory.com/2380&quot;&gt;References&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;Revision&amp;nbsp;history&lt;/s&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Linux Boot Time Optimizations for i.MX8M</category>
      <category>AN13709</category>
      <category>i.MX8M</category>
      <category>Linux Boot Time Optimizations</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2372</guid>
      <comments>https://devdockr.tistory.com/2372#entry2372comment</comments>
      <pubDate>Mon, 15 May 2023 12:54:14 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Plus 개발 환경 구축 - Yocto Command 정리</title>
      <link>https://devdockr.tistory.com/2371</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;U-Boot 사용자 지&quot; href=&quot;https://devdockr.tistory.com/2370&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Yocto 사용자 정의&quot; href=&quot;https://devdockr.tistory.com/2381&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Yocto&amp;nbsp;Command&amp;nbsp;정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;imx8mp-evk&lt;/b&gt;&lt;/i&gt;에서 자주 사용되는 &lt;i&gt;&lt;b&gt;Yocto Command&lt;/b&gt;&lt;/i&gt;를 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지 빌드 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i.MX 머신 설정을 단순화하는 &lt;i&gt;&lt;b&gt;imx-setup-release.sh&lt;/b&gt;&lt;/i&gt; 스크립트를 제공한다. 스크립트 사용시, 빌드할 머신의 이름과 그래픽 백엔드를 지정해야 한다. 스크립트는 지정된 머신과 그래픽 백엔드를 위한 디렉터리와 구성 파일을 설정한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;참고:&lt;br /&gt;&lt;i&gt;자세한 내용은 &lt;b&gt;&lt;a title=&quot;Image Build&quot; href=&quot;https://devdockr.tistory.com/2230&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;i.MX Yocto Project User`s Guide - Image Build&lt;/a&gt;&lt;/b&gt;를 참조한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;imx-setup-release.sh&lt;/b&gt;&lt;/i&gt;의 사용 문법은 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1683077398872&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ DISTRO=&amp;lt;distro-name&amp;gt; MACHINE=&amp;lt;machine-name&amp;gt; source imx-setup-release.sh -b &amp;lt;build-dir&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;DISTRO&lt;/b&gt;&lt;/i&gt;는 &quot;배포&quot;를 의미하며 여기서는 그래픽 백엔드를 지정한다. 그래픽 백엔드는 아래와 같이 3가지를 지정할 수 있으나, &lt;i&gt;&lt;b&gt;imx8mp-evk&lt;/b&gt;&lt;/i&gt;에서는 &lt;i&gt;&lt;b&gt;fsl-imx-fb&lt;/b&gt;&lt;/i&gt;를 지원하지 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;fsl-imx-wayland&lt;/b&gt;&lt;/i&gt; : &lt;b&gt;Wayland weston&lt;/b&gt; 그래픽&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;fsl-imx-xwayland&lt;/b&gt;&lt;/i&gt; : &lt;b&gt;Wayland&lt;/b&gt; 그래픽과 &lt;b&gt;X11&lt;/b&gt; (&lt;b&gt;EGL&lt;/b&gt; 사용 &lt;b&gt;X11&lt;/b&gt; 애플리케이션은 지원 안됨)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;fsl-imx-fb&lt;/b&gt;&lt;/i&gt; : 프레임 버퍼 그래픽&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;fsl-imx-fb&lt;/b&gt;&lt;/i&gt;는 &lt;b&gt;X11&lt;/b&gt;이나 &lt;b&gt;Wayland&lt;/b&gt;가 아닌 단순 프레임 버퍼용 그래픽이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;imx8mp-evk&lt;/b&gt;&lt;/i&gt;에서는 사용자의 환경에 맞게 &lt;i&gt;&lt;b&gt;fsl-imx-wayland&lt;/b&gt;&lt;/i&gt;나 &lt;i&gt;&lt;b&gt;fsl-imx-xwayland&lt;/b&gt;&lt;/i&gt;를 지정하면 된다. 해당 구성 파일은 아래의 경로에서 찾을 수 있다(&lt;i&gt;&lt;b&gt;&amp;lt;project-dir&amp;gt;&lt;/b&gt;&lt;/i&gt;은 &quot;&lt;i&gt;&lt;b&gt;repo init&lt;/b&gt;&lt;/i&gt;&quot;를 수행한 디렉터리이다.).&lt;/p&gt;
&lt;pre id=&quot;code_1683078828178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;project-dir&amp;gt;/sources/meta-imx/meta-sdk/conf/distro/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 디렉터리에는 &quot;&lt;i&gt;&lt;b&gt;include&lt;/b&gt;&lt;/i&gt;&quot; 디렉터리와 &lt;i&gt;&lt;b&gt;fsl-imx-fb.conf&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;fsl-imx-wayland.conf&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;fsl-imx-x11.conf&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;fsl-imx-xwayland.conf&lt;/b&gt;&lt;/i&gt; 파일들이 있다. 이 중 &lt;i&gt;&lt;b&gt;fsl-imx-x11.conf&lt;/b&gt;&lt;/i&gt;는 더 이상 지원하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;MACHINE&lt;/b&gt;&lt;/i&gt;에는 사용할 머신 구성 파일을 지정한다. &lt;i&gt;&lt;b&gt;imx8mp-evk&lt;/b&gt;&lt;/i&gt; 사용시 &lt;i&gt;&lt;b&gt;imx8mp-lpddr4-evk&lt;/b&gt;&lt;/i&gt;를 지정하면 된다. 사용가능한 머신 구성 파일은 아래의 경로에서 찾을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1683079330988&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;project-dir&amp;gt;/sources/meta-freescale/conf/machine/
또는
&amp;lt;project-dir&amp;gt;/sources/meta-imx/meta-bsp/conf/machine/&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;meta-imx&lt;/b&gt; 레이어는 &lt;b&gt;meta-freescale&lt;/b&gt; 레이어를 기반으로 새로 추가되거나 업데이트되는 머신 구성을 제공한다(&lt;b&gt;meta-imx&lt;/b&gt;는 &lt;b&gt;meta-freescale&lt;/b&gt;를 오버레이한다).&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;-b &amp;lt;build-dir&amp;gt;&lt;/b&gt;&lt;/i&gt;&quot;은 &lt;i&gt;&lt;b&gt;imx-setup-release.sh&lt;/b&gt;&lt;/i&gt; 스크립트에 의해 생성되는 빌드 디렉터리의 이름을 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;imx-setup-release.sh&lt;/b&gt;&lt;/i&gt; 스크립트가 처음 실행이 되면, &lt;b&gt;EULA&lt;/b&gt; 사용권 동의 메세지가 표시된다. &lt;b&gt;EULA&lt;/b&gt; 사용권에 동의하면 &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;/conf/&lt;/b&gt;&lt;/i&gt; 디렉터리 안 &lt;i&gt;&lt;b&gt;local.conf&lt;/b&gt;&lt;/i&gt; 파일에 아래와 같은 사용권 동의에 대한 정보가 저장되고 더 이상 &lt;b&gt;EULA&lt;/b&gt; 사용권 동의 메세지가 출력되지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1683084943918&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#	지정한 머신 정보
MACHINE ??= 'imx8mp-lpddr4-evk'
#	지정한 그래픽 백엔드 정보
DISTRO ?= 'fsl-imx-wayland'
...
#	EULA 사용권 동의
ACCEPT_FSL_EULA = &quot;1&quot;
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;-b&lt;/b&gt;&lt;/i&gt; 옵션으로 지정된 &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;&lt;/b&gt;&lt;/i&gt;이 작업 디렉터리이다. &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;/conf/&lt;/b&gt;&lt;/i&gt; 폴더에 &lt;i&gt;&lt;b&gt;bblayers.conf&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;local.conf&lt;/b&gt;&lt;/i&gt; 등의 파일이 생성된다. &lt;i&gt;&lt;b&gt;bblayers.conf&lt;/b&gt;&lt;/i&gt;에는 사용되는 메타레이어가 포함되어 있다. 사용자 정의 레이어 추가시 &lt;i&gt;&lt;b&gt;bblayers.conf&lt;/b&gt;&lt;/i&gt;&amp;nbsp;파일에 아래와 같이 경로를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683085454521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LCONF_VERSION = &quot;7&quot;

BBPATH = &quot;${TOPDIR}&quot;
BSPDIR := &quot;${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}&quot;
...
# 마지막 라인에 추가한다.
BBLAYERS += &quot;${BSPDIR}/sources/&amp;lt;custom-layer&amp;gt;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지 빌드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 빌드시 아래의 커맨드를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683094798309&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	지정한 &amp;lt;target&amp;gt;로 이미지를 빌드한다.
$ bitbake &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정 가능한 &lt;i&gt;&lt;b&gt;&amp;lt;target&amp;gt;&lt;/b&gt;&lt;/i&gt;는 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;imx-image-core&lt;/b&gt;&lt;/i&gt; : &lt;b&gt;Wayland&lt;/b&gt; 백엔드에 사용할 테스트 애플리케이션이 있는 이미지 생성&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;imx-image-multimedia&lt;/b&gt;&lt;/i&gt; : Qt 콘텐츠가 없는 GUI로 이미지 생성&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;imx-image-full&lt;/b&gt;&lt;/i&gt; : 머신 러닝 기능이 포함된 오픈 소스 Qt 이미지를 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 이미지 빌드시 필요한 패키지를 다운로드하고 빌드하기 때문에 시간이 많이 소요된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SDK 빌드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정한 &lt;i&gt;&lt;b&gt;&amp;lt;target&amp;gt;&lt;/b&gt;&lt;/i&gt;에 해당하는 SDK를 빌드하는 커맨드는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1683095539998&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ DISTRO=&amp;lt;distro-name&amp;gt; MACHINE=&amp;lt;machine-name&amp;gt; bitbake &amp;lt;target&amp;gt; -c populate_sdk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;lt;distro-name&amp;gt;&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;&amp;lt;machine-name&amp;gt;&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;&amp;lt;target&amp;gt;&lt;/b&gt;&lt;/i&gt;은 위에서 설명한 값으로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK는 &lt;i&gt;&lt;b&gt;&amp;lt;project-dir&amp;gt;/&amp;lt;build-dir&amp;gt;/tmp/deploy/sdk&lt;/b&gt;&lt;/i&gt; 디렉터리에 확장자가 &lt;i&gt;&lt;b&gt;.sh&lt;/b&gt;&lt;/i&gt;로 생성된다. 사용할 Host PC로 파일을 복사하고 설치하면 된다. 기본 설치 경로는 &lt;i&gt;&lt;b&gt;/opt/&amp;lt;distro-name&amp;gt;/&amp;lt;kernel-ver&amp;gt;-&amp;lt;yocto-ver&amp;gt;/environment-setup-armv8a-poky-linux&lt;/b&gt;&lt;/i&gt; 이다. &lt;i&gt;&lt;b&gt;&amp;lt;kernel-ver&amp;gt;&lt;/b&gt;&lt;/i&gt;은 커널 버전을 나타내고, &lt;i&gt;&lt;b&gt;&amp;lt;yocto-ver&amp;gt;&lt;/b&gt;&lt;/i&gt;은 Yocto Project 버전을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 환경 설정을 위해 아래의 커맨드를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683096184752&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	SDK 환경 설정을 한다.
$ source /opt/&amp;lt;distro-name&amp;gt;/&amp;lt;kernel-ver&amp;gt;-&amp;lt;yocto-ver&amp;gt;/environment-setup-armv8a-poky-linux
$ export ARCH=arm64&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-Boot 관련&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;u-boot 코드를 수정한 후 컴파일하고 imx-boot를 만드는 커맨드는 아래와 같다(순차적으로 실행한다).&lt;/p&gt;
&lt;pre id=&quot;code_1685417605333&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c compile u-boot-imx
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c install u-boot-imx
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c deploy u-boot-imx

$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c compile imx-boot
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c install imx-boot
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c deploy imx-boot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 아래와 같이 수행해도 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1685417789691&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c compile u-boot-imx
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake u-boot-imx imx-boot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 중간 결과물을 삭제시에는 아래의 커맨드를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685418317045&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c clean u-boot-imx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 u-boot 소스를 삭제시에는 아래의 커맨드를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685418428538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c cleanall u-boot-imx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;lt;machine-name&amp;gt;&lt;/b&gt;&lt;/i&gt;은 위에서 설명한 값으로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kernel 관련&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 소스를 수정 후 빌드하는 커맨드는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1685418504490&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c compile linux-imx
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c install linux-imx
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c deploy linux-imx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 중간 결과물을 삭제시에는 아래의 커맨드를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685418577258&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c clean linux-imx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 커널 소스를 삭제시에는 아래의 커맨드를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685418610795&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c cleanall linux-imx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;lt;machine-name&amp;gt;&lt;/b&gt;&lt;/i&gt;은 위에서 설명한 값으로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-Boot, Kernel 소스 수정후 이미지 빌드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스 수정후 이미지 빌드는 아래의 커맨드를 순차적으로 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685419722036&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c rootfs &amp;lt;target&amp;gt;
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c image_wic &amp;lt;target&amp;gt;
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c image_complete &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;lt;machine-name&amp;gt;&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;&amp;lt;target&amp;gt;&lt;/b&gt;&lt;/i&gt;은 위에서 설명한 값으로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Recipe Dependency 그래프 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레시피에 대한 의존성 그래프를 생성하는 커맨드는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1685422427427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -g &amp;lt;recipe-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 커맨드를 실행하면, 해당 빌드 디렉토리에 &quot;task-depens.dot&quot; 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일을 아래의 커맨드를 사용하여 PDF 문서로 만들 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1685422536273&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ dot -Tpdf task-depends.dot -o outfile.pdf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dot 프로그램이 설치되어 있지 않으면, 아래의 커맨드를 수행해 설치를 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685422750841&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install graphviz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 커맨드를 수행하면 GUI 윈도우에서 레시피의 의존성을 볼 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1685422875860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -g -u taskexp &amp;lt;recipe-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Recipe에서 사용가능한 Task 출력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 커맨드를 사용하여 레시피에서 지원하는 태스크를 출력할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1685583819039&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -c listtasks &amp;lt;recipe-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 커맨드로 해당 레시피에서 원하는 태스크 수행할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1685583978876&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -c &amp;lt;task&amp;gt; &amp;lt;recipe-name&amp;gt;
또는 
$ MACHINE=&amp;lt;machine-name&amp;gt; bitbake -f -c &amp;lt;task&amp;gt; &amp;lt;recipe-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;U-Boot 사용자 지&quot; href=&quot;https://devdockr.tistory.com/2370&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Yocto 사용자 정의&quot; href=&quot;https://devdockr.tistory.com/2381&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Evaluation Kit for the i.MX 8M Plus</category>
      <category>i.MX</category>
      <category>i.MX 8M Plus</category>
      <category>Yocto Command 정리</category>
      <category>개발 환경 구축</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2371</guid>
      <comments>https://devdockr.tistory.com/2371#entry2371comment</comments>
      <pubDate>Wed, 3 May 2023 10:15:40 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Plus 개발 환경 구축 - U-Boot 사용자 지정</title>
      <link>https://devdockr.tistory.com/2370</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;커널 사용자 지정&quot; href=&quot;https://devdockr.tistory.com/2369&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Yocto Command 정리&quot; href=&quot;https://devdockr.tistory.com/2371&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;U-Boot&amp;nbsp;사용자&amp;nbsp;지정&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;커널 사용자 지정에서 &quot;&lt;b&gt;repo 설정&lt;/b&gt;&quot;, &quot;&lt;b&gt;Yocto Project 설정&lt;/b&gt;&quot;과 &quot;&lt;b&gt;빌드 구성&lt;/b&gt;&quot;을 먼저 진행했다고 가정한다.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;SDK를 설치한 상태라고 가정한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-Boot 소스 코드 복사&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 단계에 따라 u-boot 소스 코드를 로컬 저장소로 복사한다. 기본 디렉터리는 &quot;&lt;i&gt;&lt;b&gt;/&amp;lt;project-dir&amp;gt;/&amp;lt;build-dir&amp;gt;&lt;/b&gt;&lt;/i&gt;&quot; 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1682989017805&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	u-boot 소스 코드를 다운로드하여 압축을 푼다.
$ bitbake -c unpack virtual/bootloader

//	로컬 저장소를 생성한다.
$ mkdir -p ../local_repos/uboot-imx

//	u-boot 소스 코드를 로컬 저장소로 복사한다.
$ cp -a tmp/work/imx8mp_lpddr4_evk-poky-linux/u-boot-imx/2022.04-r0/git/. ../local_repos/uboot-imx

//	로컬 저장소로 이동한다.
$ cd ../local_repos/uboot-imx

//	가장 최근 commit으로 되돌리고, unstaged 상태의 변경 사항을 모두 제거한다.
$ git reset --hard

//	untracked(추적되지 않는) 파일(디렉터리)을 삭제한다.
$ git clean -fdx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;/local_repos/uboot-imx/&lt;/b&gt;&lt;/i&gt;&quot;에서 u-boot와 관련된 수정 작업을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-Boot 구성 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;/local_repos/uboot-imx/&lt;/b&gt;&lt;/i&gt;&quot;에서 다음을 실행하여 사용자 지정&amp;nbsp;&lt;i&gt;&lt;b&gt;defconfig&lt;/b&gt;&lt;/i&gt;를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682991003933&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	구성 이전으로 되돌린다(소스 코드 압축 해제 후 상태로...).
$ make distclean

//	구성을 설정한다.
$ make imx8mp_evk_defconfig

//	u-boot 메뉴 구성을 실행한다.
$ make menuconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 메뉴에서 사용하거나 해제할 u-boot 기능을 선택하여 수정한 후, 새로운 구성을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음을 수행하여 업데이트된 defconfig를 적용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682994685295&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	defconfig를 저장한다.
$ make savedefconfig

//	원본 defconfig를 다른 파일명으로 변경한다.
$ cp configs/imx8mp_evk_defconfig configs/imx8mp_evk_defconfig.orig

//	사용할 defconfig를 저장한다.
$ cp defconfig configs/imx8mp_evk_defconfig

//	구성 이전으로 되돌린다.
$ make distclean

//	구성을 설정한다.
$ make imx8mp_evk_defconfig&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;u-boot console&lt;/b&gt; 기본 속도를 변경하려면, &lt;b&gt;defconfig&lt;/b&gt; 파일에 &quot;&lt;b&gt;CONFIG_BAUDRATE=baudrate&lt;/b&gt;&quot;를 추가해야 한다. 보드 구성 헤더 파일(&lt;b&gt;/include/configs/imx8mp_evk.h&lt;/b&gt;)에 추가하면 변경이 되지 않는다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-Boot 패치 파일 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;/local_repos/uboot-imx/&lt;/b&gt;&lt;/i&gt;&quot;에서 필요한 소스를 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음을 수행하여 패치 파일을 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683002655673&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	패치 파일을 생성한다.
$ git diff &amp;gt; &amp;lt;custom-name&amp;gt;.patch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 사용자 지정에서 만든 사용자 지정 레이어에 다음을 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683003934695&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	프로젝트 디렉터리로 이동한다.
$ cd &amp;lt;project-dir&amp;gt;

//	u-boot 패치 관련 디렉터리를 생성한다.
$ make -p sources/&amp;lt;custom-layer&amp;gt;/recipes-bsp/u-boot/u-boot-imx/fsl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;sources/&amp;lt;custom-layer&amp;gt;/recipes-bsp/u-boot&lt;/b&gt;&lt;/i&gt;&quot; 디렉터리에 &quot;&lt;i&gt;&lt;b&gt;u-boot-imx_2022.04.bbappend&lt;/b&gt;&lt;/i&gt;&quot; 파일을 생성하고 아래의 내용을 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683004041549&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Copyright
# Released under the MIT license (see COPYING.MIT for the terms)
#
# SPDX-License-Identifier: MIT
#

FILESEXTRAPATHS:prepend := &quot;${BSPDIR}/sources/&amp;lt;custom-layer&amp;gt;/recipes-bsp/u-boot/${PN}:&quot;
SRC_URI += &quot;file://u-boot.patch&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 패치 파일을 &quot;&lt;i&gt;&lt;b&gt;sources/&amp;lt;custom-layer&amp;gt;/recipes-bsp/u-boot/u-boot-imx/fsl&lt;/b&gt;&lt;/i&gt;&quot; 디렉터리에 &quot;&lt;i&gt;&lt;b&gt;u-boot.patch&lt;/b&gt;&lt;/i&gt;&quot; 이름으로 복사한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683004214155&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	패치 파일을 복사한다.
cp local_repos/uboot-imx/&amp;lt;custom-name&amp;gt;.patch sources/&amp;lt;custom-layer&amp;gt;/recipes-bsp/u-boot/u-boot-imx/fsl/u-boot.patch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 커맨드로 u-boot를 빌드한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683004344019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	u-boot를 빌드한다.
$ MACHIONE=&amp;lt;custom-layer&amp;gt; bitbake imx-boot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 후 바이너리 파일은 &quot;&lt;i&gt;&lt;b&gt;tmp/deploy/images/&amp;lt;custom-layer&amp;gt;/imx-boot-&amp;lt;custom-layer&amp;gt;-sd.bin-flash_evk&lt;/b&gt;&lt;/i&gt;&quot;에 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;커널 사용자 지정&quot; href=&quot;https://devdockr.tistory.com/2369&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Yocto Command 정리&quot; href=&quot;https://devdockr.tistory.com/2371&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Evaluation Kit for the i.MX 8M Plus</category>
      <category>i.MX</category>
      <category>i.MX 8M Plus</category>
      <category>U-Boot 소스 수정</category>
      <category>개발 환경 구축</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2370</guid>
      <comments>https://devdockr.tistory.com/2370#entry2370comment</comments>
      <pubDate>Tue, 2 May 2023 09:32:40 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Plus 개발 환경 구축 - 커널 사용자 지정</title>
      <link>https://devdockr.tistory.com/2369</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;U-Boot 빌드&quot; href=&quot;https://devdockr.tistory.com/2363&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;U-Boot 사용자 지정&quot; href=&quot;https://devdockr.tistory.com/2370&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커널 사용자 지정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커널 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Yocto Project에서 사용하는 기본 커널 구성 파일은 커널 소스 트리의 일부로 아래 위치에 있다(Yocto Project에서 커널 위치는 &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;/tmp/work-shared/imx8mp-lpddr4-evk/kernel-source/&lt;/b&gt;&lt;/i&gt; 이다.).&lt;/p&gt;
&lt;pre id=&quot;code_1682308032136&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arch/arm64/configs/imx_v8_defconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널을 구성하기 전에 Yocto Project 작업 순서는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;repo 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1682312284673&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	bin 폴더가 있는 경우, 아래 단계는 생략한다.
$ mkdir ~/bin
//	repo를 다운로드 받는다.
$ curl https://storage.googleapis.com/git-repo-downloads/repo &amp;gt; ~/bin/repo
//	repo의 실행 권한을 설정한다.
$ chmod a+x ~/bin/repo
//	.bashrc 파일에 ~/bin 경로를 PATH 환경 변수에 추가한다.
export PATH=~/bin:$PATH&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Yocto Project 설정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1682312412150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	git를 설정한다.
$ git config --global user.name &quot;Your Name&quot;
$ git config --global user.email &quot;Your Email&quot;
//	설정 내용을 확인한다.
$ git config --list&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Yocto Project 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1682312678713&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	디렉터리를 생성한다.
$ mkdir &amp;lt;project-dir&amp;gt;
//	생성한 디렉터리로 이동한다.
$ cd &amp;lt;project-dir&amp;gt;
//	repo를 사용하여 초기화한다(버전에 맞게 설정한다).
$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-langdale -m imx-6.1.1-1.0.0.xml
또는
$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-kirkstone -m imx-5.15.52-2.1.0.xml
//	repo를 동기화한다.
$ repo sync&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빌드 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1682312905214&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	빌드 구성을 진행한다(&amp;lt;build-dir&amp;gt;에 원하는 빌드 디렉터리를 설정한다).
$ DISTRO=fsl-imx-wayland MACHINE=imx8mp-lpddr4-evk source imx-setup-release.sh -b &amp;lt;build-dir&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;커널 구성&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 menuconfig를 실행하여 필요한 작업을 진행한다(작업을 완료한 후, 저장하고 menuconfig에서 나온다).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1682313783622&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	커널 menuconfig 실행
$ bitbake linux-imx -c menuconfig
또는
$ bitbake -c menuconfig virtual/kernel&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;.config&lt;/b&gt;&lt;/i&gt; 커널 구성 파일은 &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;/tmp/work/imx8mp_lpddr4_evk-poky-linux/linux-imx/6.1.y+gitAUTOINC+29549c7073-r0/build/.config&lt;/b&gt;&lt;/i&gt;에 저장된다(사용하는 커널 버전에 따라 &quot;&lt;i&gt;&lt;b&gt;6.1.y+gitAUTOINC+29549c7073-r0&lt;/b&gt;&lt;/i&gt;&quot; 디렉터리만 달라진다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시점에서 &quot;&lt;i&gt;&lt;b&gt;bitbake imx-image-full&lt;/b&gt;&lt;/i&gt;&quot; 커맨드를 사용하여 이미지를 빌드하거나 &quot;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;bitbake virtual/kernel&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&quot;이나 &quot;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;bitbake linux-imx&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&quot; 커맨드를 사용하여 커널을 빌드할 수 있다. 또는 변경 사항을 영구적으로 적용하기 위해 다음 단계를 수행할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경된 커널 구성 영구 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1682314802939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	.config를 defconfig에 적용한다.
$ bitbake -c savedefconfig virtual/kernel
또는
$ bitbake -c savedefconfig linux-imx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;.config&lt;/b&gt;&lt;/i&gt; 커널 구성 파일이 있는 디렉터리에 &lt;i&gt;&lt;b&gt;defconfig&lt;/b&gt;&lt;/i&gt; 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구성을 영구적으로 사용하려면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;defconfig&lt;/b&gt;&lt;/i&gt; 파일을 &lt;i&gt;&lt;b&gt;arch/arm64/configs/imx_v8_defconfig&lt;/b&gt;&lt;/i&gt;&amp;nbsp;파일에 덮어쓴다(overwrite 한다).&lt;/li&gt;
&lt;li&gt;커널 레시피에서 소스 트리 외부의 &lt;i&gt;&lt;b&gt;defconfig&lt;/b&gt;&lt;/i&gt;를 사용하도록 설정한다(커스텀 레이어 사용).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;커스텀 레이어 생성 (사용자 정의 defconfig 적용)&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;참고:&lt;br /&gt;&lt;i&gt;&lt;b&gt;IMXBSPPG&lt;/b&gt;&lt;/i&gt;와 &lt;i&gt;&lt;b&gt;IMXLXYOCTOUG&lt;/b&gt;&lt;/i&gt; 문서의 내용으로 커스텀 레이어를 생성하여 사용자 정의 &lt;i&gt;&lt;b&gt;defconfig&lt;/b&gt;&lt;/i&gt; 파일을 적용하면 &lt;i&gt;&lt;b&gt;imx8mpevk&lt;/b&gt;&lt;/i&gt;에서는 적용이 안되는 문제가 있다. 그래서 아래의 내용은 직접 찾은 방법을 설명한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀 레이어를 생성한다(현재 &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;&lt;/b&gt;&lt;/i&gt;에 위치한다고 가정한다).&lt;/p&gt;
&lt;pre id=&quot;code_1682392600352&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	커스텀 레이어 생성 (기본 샘플 레이어가 생성된다.)
$ bitbake-layers create-layer ../sources/&amp;lt;custom-layer&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;/sources/&amp;lt;custom-layer&amp;gt;/conf/layer.conf&lt;/b&gt;&lt;/i&gt; 파일의 내용을 아래와 같이 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682394119236&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# We have a conf and classes directory, add to BBPATH
BBPATH .= &quot;:${LAYERDIR}&quot;

# We have recipes-* directories, add to BBFILES
BBFILES += &quot;${LAYERDIR}/recipes-*/*/*.bb \
            ${LAYERDIR}/recipes-*/*/*.bbappend&quot;

BBFILE_COLLECTIONS += &quot;meta-thermal&quot;
BBFILE_PATTERN_meta-thermal = &quot;^${LAYERDIR}/&quot;
BBFILE_PRIORITY_meta-thermal = &quot;6&quot;

LAYERDEPENDS_meta-thermal = &quot;core&quot;
LAYERSERIES_COMPAT_meta-thermal = &quot;kirkstone langdale&quot;

# 꼭 추가해야 한다(사용할 리눅스를 설정).
PREFERRED_PROVIDER_virtual/kernel_thermal = &quot;linux-imx&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;/sources/&amp;lt;custom-layer&amp;gt;/conf/machine&lt;/b&gt;&lt;/i&gt; 디렉터리를 생성하고, &lt;i&gt;&lt;b&gt;/sources/meta-imx/meta-bsp/conf/machine/imx8mpevk.conf&lt;/b&gt;&lt;/i&gt; 파일을 &lt;i&gt;&lt;b&gt;/sources/&amp;lt;custom-layer&amp;gt;/conf/machine/&amp;lt;custom-name&amp;gt;.conf&lt;/b&gt;&lt;/i&gt;로 복사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;/conf/bblayers.conf&lt;/b&gt;&lt;/i&gt; 파일에 &lt;i&gt;&lt;b&gt;&amp;lt;custom-layer&amp;gt;&lt;/b&gt;&lt;/i&gt;를 아래와 같이 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682394652916&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BBLAYERS = &quot; \
  ${BSPDIR}/sources/poky/meta \
  ${BSPDIR}/sources/poky/meta-poky \
  \
  ${BSPDIR}/sources/meta-openembedded/meta-oe \
  ${BSPDIR}/sources/meta-openembedded/meta-multimedia \
  ${BSPDIR}/sources/meta-openembedded/meta-python \
  \
  ${BSPDIR}/sources/meta-freescale \
  ${BSPDIR}/sources/meta-freescale-3rdparty \
  ${BSPDIR}/sources/meta-freescale-distro \
  ${BSPDIR}/sources/&amp;lt;custom-layer&amp;gt; \
&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;/sources/&amp;lt;custom-layer&amp;gt;/recipes-kernel/linux/linux-imx&lt;/b&gt;&lt;/i&gt; 디렉터리를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682580055690&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// -p 옵션을 주면 하위 디렉터리까지 순차적으로 생성된다.
$ mkdir -p /sources/&amp;lt;custom-layer&amp;gt;/recipes-kernel/linux/linux-imx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;defconfig&lt;/b&gt;&lt;/i&gt; 파일을 복사한다(사용하는 커널 버전에 따라 &lt;i&gt;&lt;b&gt;6.1.y+gitAUTOINC+29549c7073-r0&lt;/b&gt;&lt;/i&gt; 디렉터리는 변경될 수 있다).&lt;/p&gt;
&lt;pre id=&quot;code_1682320193360&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	커널 레시피가 있는 디렉터리로 이동한다.
$ cd ~/&amp;lt;project-dir&amp;gt;/sources/&amp;lt;custom-layer&amp;gt;/recipes-kernel/linux

//	defconfig 파일을 linux-imx 디렉터리에 복사한다.
$ cp ~/&amp;lt;project-dir&amp;gt;/&amp;lt;build-dir&amp;gt;/tmp/work/imx8mp_lpddr4_evk-poky-linux/linux-imx/6.1.y+gitAUTOINC+29549c7073-r0/build/defconfig linux-imx/defconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;~/&amp;lt;project-dir&amp;gt;/sources/&amp;lt;custom-layer&amp;gt;/recipes-kernel/linux&lt;/b&gt;&lt;/i&gt; 디렉터리에 &lt;i&gt;&lt;b&gt;linux-imx_6.1.bbappend&lt;/b&gt;&lt;/i&gt; 파일을 생성하여 아래의 내용을 추가한다(사용하는 커널 버전에 따라 파일 이름이 변경될 수 있다).&lt;/p&gt;
&lt;pre id=&quot;code_1682320617416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Copyright
# Released under the MIT license (see COPYING.MIT for the terms)
#
# SPDX-License-Identifier: MIT
#

FILESEXTRAPATHS:prepend := &quot;${THISDIR}/${PN}:&quot;

# 현재 디렉터리를 얻어오는 방법이 없어서 ${THISDIR}를 기준으로 작업 디렉터리를 설정한다.
CUSTOM_KERNEL_DIR = &quot;${THISDIR}/../../../../&amp;lt;custom-layer&amp;gt;/recipes-kernel/linux/${PN}&quot;
CUSTOM_KERNEL_CONFIG_AARCH64 = &quot;defconfig&quot;

addtask pre_copy_defconfig after do_kernel_configme before do_copy_defconfig
do_pre_copy_defconfig () {
	if [ ${DO_CONFIG_V7_COPY:mx8-nxp-bsp} = &quot;no&quot; ]; then
        # defconfig를 커널 구성에 사용하기 위해 파일을 복사한다.
        mkdir -p ${B}
        cp ${CUSTOM_KERNEL_DIR}/${CUSTOM_KERNEL_CONFIG_AARCH64} ${S}/arch/arm64/configs/${IMX_KERNEL_CONFIG_AARCH64}
    fi
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;bitbake -c cleanall linux-imx&lt;/b&gt;&lt;/i&gt;&quot;을 먼저 실행하여 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;MACHINE=&amp;lt;custom-layer&amp;gt; &lt;span style=&quot;text-align: left;&quot;&gt;bitbake virtual/kernel&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&quot;이나 &quot;&lt;i&gt;&lt;b&gt;MACHINE=&amp;lt;custom-layer&amp;gt; &lt;span style=&quot;text-align: left;&quot;&gt;bitbake linux-imx&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&quot;를 실행하여 커스텀 &lt;i&gt;&lt;b&gt;defconfig&lt;/b&gt;&lt;/i&gt;가 적용이 되는지 확인한다. 확인 방법은 &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;/tmp/work/&amp;lt;custom-layer&amp;gt;-poky-linux/linux-imx/6.1.y+gitAUTOINC+29549c7073-r0/defconfig&lt;/b&gt;&lt;/i&gt; 파일이 사용자 지정&amp;nbsp;&lt;i&gt;&lt;b&gt;defconfig&lt;/b&gt;&lt;/i&gt; 파일과 내용이 같은지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;6.1.y+gitAUTOINC+29549c7073-r0&lt;/b&gt;&lt;/i&gt; 디렉터리는 커널 버전에 따라 변경될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;커스텀 레이어 (커널 소스 패치 파일 적용)&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;참고:&lt;br /&gt;커널 소스 패치 적용에 대한 자세한 내용은 다음 사이트를 참고한다.&lt;br /&gt;&lt;a href=&quot;https://variwiki.com/index.php?title=Yocto_Customizing_the_Linux_kernel&amp;amp;release=mx8mp-yocto-kirkstone-5.15.71_2.2.0-v1.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Yocto_Customizing_the_Linux_kernel&lt;/a&gt;&lt;br /&gt;위 사이트 3가지 방법 중 첫 번째 방법을 적용하는 방법을 설명한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &quot;&lt;i&gt;&lt;b&gt;MACHINE=&amp;lt;custom-layer&amp;gt; bitbake virtual/kernel&lt;/b&gt;&lt;/i&gt;&quot;이나 &quot;&lt;i&gt;&lt;b&gt;MACHINE=&amp;lt;custom-layer&amp;gt; bitbake linux-imx&lt;/b&gt;&lt;/i&gt;&quot;를 실행하여 완료한 후라고 가정한다. 현재 디렉터리 위치는 &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;&lt;/b&gt;&lt;/i&gt; 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1682644367538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	패치 파일을 찾아 소스코드에 적용한다.
$ MACHINE=&amp;lt;custom-layer&amp;gt; bitbake -c patch virtual/kernel
또는
$ MACHINE=&amp;lt;custom-layer&amp;gt; bitbake -c patch linux-imx

//	커널 소스를 저장할 로컬 저장소 생성(-p 옵션으로 하위 디렉터리까지 생성)한다.
//	로컬 저장소는 &amp;lt;project-dir&amp;gt; 아래 생성된다.
$ mkdir -p ../local_repos/linux-imx

//	커널 소스를 로컬 저장소로 복사한다.
$ cp -a tmp/work-shared/&amp;lt;custom-layer&amp;gt;/kernel-source/. ../local_repos/linux-imx

//	로컬 저장소로 이동한다.
$ cd ../local_repos/linux-imx

//	가장 최근 commit으로 되돌리고, unstaged 상태의 변경 사항을 모두 제거한다.
$ git reset --hard

//	untracked(추적되지 않는) 파일(디렉터리)을 삭제한다.
$ git clean -fdx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;local_repos/linux-imx&lt;/b&gt;&lt;/i&gt;&quot;에서 커널 소스와 관련된 수정 작업을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업이 완료되면 패치 파일을 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682645468118&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//	git로 패치 파일을 생성한다.
$ git diff &amp;gt; &amp;lt;custom-name&amp;gt;.patch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;local_repos/linux-imx/&amp;lt;custom-name&amp;gt;.patch&lt;/b&gt;&lt;/i&gt;&quot; 파일이 생성될 것이다. 해당 파일을 &quot;&lt;i&gt;&lt;b&gt;&amp;lt;project-dir&amp;gt;/sources/meta-imx/meta-bsp/recipes-kernel/linux/linux-imx&lt;/b&gt;&lt;/i&gt;&quot; 디렉터리에 복사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 작업한 &quot;&lt;i&gt;&lt;b&gt;linux-imx_6.1.bbappend&lt;/b&gt;&lt;/i&gt;&quot; 파일의 내용을 아래와 같이 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682645972253&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Copyright
# Released under the MIT license (see COPYING.MIT for the terms)
#
# SPDX-License-Identifier: MIT
#

FILESEXTRAPATHS:prepend := &quot;${THISDIR}/${PN}:&quot;
SRC_URI += &quot;file://&amp;lt;custom-name&amp;gt;.patch&quot;

# 현재 디렉터리를 얻어오는 방법이 없어서 ${THISDIR}를 기준으로 작업 디렉터리를 설정한다.
CUSTOM_KERNEL_DIR = &quot;${THISDIR}/../../../../&amp;lt;custom-layer&amp;gt;/recipes-kernel/linux/${PN}&quot;
CUSTOM_KERNEL_CONFIG_AARCH64 = &quot;defconfig&quot;

addtask pre_copy_defconfig after do_kernel_configme before do_copy_defconfig
do_pre_copy_defconfig () {
	if [ ${DO_CONFIG_V7_COPY:mx8-nxp-bsp} = &quot;no&quot; ]; then
        # defconfig를 커널 구성에 사용하기 위해 파일을 복사한다.
        mkdir -p ${B}
        cp ${CUSTOM_KERNEL_DIR}/${CUSTOM_KERNEL_CONFIG_AARCH64} ${S}/arch/arm64/configs/${IMX_KERNEL_CONFIG_AARCH64}
    fi
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;MACHINE=&amp;lt;custom-layer&amp;gt; bitbake -c cleanall linux-imx&lt;/b&gt;&lt;/i&gt;&quot;를 사용하여 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;&lt;b&gt;MACHINE=&amp;lt;custom-layer&amp;gt; bitbake virtual/kernel&lt;/b&gt;&lt;/i&gt;&quot;이나 &quot;&lt;i&gt;&lt;b&gt;MACHINE=&amp;lt;custom-layer&amp;gt; bitbake linux-imx&lt;/b&gt;&lt;/i&gt;&quot;를 사용하여 빌드를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;U-Boot 빌드&quot; href=&quot;https://devdockr.tistory.com/2363&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;U-Boot 사용자 지정&quot; href=&quot;https://devdockr.tistory.com/2370&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Evaluation Kit for the i.MX 8M Plus</category>
      <category>i.MX</category>
      <category>i.MX 8M Plus</category>
      <category>개발 환경 구축</category>
      <category>커널 소스 수정</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2369</guid>
      <comments>https://devdockr.tistory.com/2369#entry2369comment</comments>
      <pubDate>Mon, 24 Apr 2023 12:39:22 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Series MIPI Capture System(AN13857) - Revision history</title>
      <link>https://devdockr.tistory.com/2368</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Interlaced sensor support and De-interlacing&quot; href=&quot;https://devdockr.tistory.com/2367&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [다음]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9 Revision&amp;nbsp;history&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Table&amp;nbsp;44.&amp;nbsp;Revision&amp;nbsp;history&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 33.3333%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Revision&amp;nbsp;number&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 33.3333%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Date&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 33.3333%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Substantive&amp;nbsp;changes&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;15&amp;nbsp;March&amp;nbsp;2023&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;릴리스 개시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Interlaced sensor support and De-interlacing&quot; href=&quot;https://devdockr.tistory.com/2367&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [다음]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/i.MX 8M Series MIPI Capture System</category>
      <category>AN13857</category>
      <category>i.MX</category>
      <category>MIPI Capture System</category>
      <category>Revision History</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2368</guid>
      <comments>https://devdockr.tistory.com/2368#entry2368comment</comments>
      <pubDate>Tue, 11 Apr 2023 14:23:49 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Series MIPI Capture System(AN13857) - Interlaced sensor support and De-interlacing</title>
      <link>https://devdockr.tistory.com/2367</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Embedded data support&quot; href=&quot;https://devdockr.tistory.com/2366&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Revision history&quot; href=&quot;https://devdockr.tistory.com/2368&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8 Interlaced&amp;nbsp;sensor&amp;nbsp;support&amp;nbsp;and&amp;nbsp;De-interlacing&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 i.MX 8M 시리즈 프로세서는 인터레이스 MIPI 카메라를 지원할 수 있다. 단, i.MX 8MN과 i.MX 8MP에서만 하드웨어 디인터레이싱 기능을 지원할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 사례 예제:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;센서에서 인터레이스된 odd/even 프레임(720x288,&amp;nbsp;yuv422)을 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 이 사용 사례에 대해 ISI weaving 디인터레이싱을 활성화하는 방법에 대해 다음 단계를 참조할 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;720x288, yuv422 프레임 수신 방법은 &lt;u&gt;Section 6.2&lt;/u&gt;와 &lt;u&gt;Section 6.3&lt;/u&gt;을 참조한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;GASKET_x_CTRL[GASKET_x_INTER_MODE]&lt;/b&gt;&lt;/i&gt; 필드를 01b로 구성한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;CHNL_IMG_CTRL[DEINT]&lt;/b&gt;&lt;/i&gt; 필드를 10b 또는 11b로 구성하면, 디인터레이스 프레임이 &lt;i&gt;&lt;b&gt;FRM_STRD&lt;/b&gt;&lt;/i&gt; 인터럽트 두 번마다 메모리에 저장된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Embedded data support&quot; href=&quot;https://devdockr.tistory.com/2366&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Revision history&quot; href=&quot;https://devdockr.tistory.com/2368&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/i.MX 8M Series MIPI Capture System</category>
      <category>AN13857</category>
      <category>i.MX</category>
      <category>Interlaced sensor support and De-interlacing</category>
      <category>MIPI Capture System</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2367</guid>
      <comments>https://devdockr.tistory.com/2367#entry2367comment</comments>
      <pubDate>Tue, 11 Apr 2023 14:14:39 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Series MIPI Capture System(AN13857) - Embedded data support</title>
      <link>https://devdockr.tistory.com/2366</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Embedded data support&quot; href=&quot;https://devdockr.tistory.com/2365&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Interlaced sensor support and De-interlacing&quot; href=&quot;https://devdockr.tistory.com/2367&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7 Embedded&amp;nbsp;data&amp;nbsp;support&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 카메라 센서는 이미지 데이터와 함께 임베디드된 데이터를 보낼 수 있다. &lt;u&gt;Figure 6&lt;/u&gt;에서 볼 수 있듯이, 임베디드된 데이터는 프레임의 시작이나 끝에 포함된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AN13857_F06.png&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFRPNe/btr9nmulpPq/469shrhbu8FRMWTxMI6Sok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFRPNe/btr9nmulpPq/469shrhbu8FRMWTxMI6Sok/img.png&quot; data-alt=&quot;Figure 6. Structure with Embedded Data at the Beginning and End of the Frame&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFRPNe/btr9nmulpPq/469shrhbu8FRMWTxMI6Sok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFRPNe%2Fbtr9nmulpPq%2F469shrhbu8FRMWTxMI6Sok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1303&quot; height=&quot;822&quot; data-filename=&quot;AN13857_F06.png&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 6. Structure with Embedded Data at the Beginning and End of the Frame&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MIPI CSI-2 사양에 따르면, 임베디드된 데이터의 데이터 유형은 이미지 데이터 유형(0x18에서 0x3F까지)과 다른 0x12여야 한다. 이 경우, 카메라 스트림에는 인터리빙 모드의 데이터 유형으로 정의되는 여러 유형의 데이터가 포함된다. 그러나 8M 시리즈 캡처 시스템은 인터리빙 모드의 데이터 유형을 지원할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 사례 예제:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;센서에서 이미지 프레임(640x480, RAW12)과 프레임 시작 부분에 2라인이 임베디된 데이터를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사용 사례를 지원하려면, 해결 방법으로 사용자는 다음을 수행해야 한다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이미지 데이터 유형(RAW12: 0x2C)으로 임베디드된 데이터를 출력하도록 센서를 구성한다.&lt;/li&gt;
&lt;li&gt;이미지 픽셀과 정렬되도록 각 임베디드된 데이터에 대해 0을 추가하도록 센서를 구성한다(12비트 정렬, {embedded&amp;nbsp;data,&amp;nbsp;4b&amp;rsquo;0}).&lt;/li&gt;
&lt;li&gt;그러면 이 센서의 총 출력은 RAW12 데이터의 640x482 크기로 간주할 수 있다. 사용자는 이 경우를 지원하도록 Rx 캡처 시스템을 구성하는 방법에 대한 자세한 내용을 &lt;u&gt;Section 6.2&lt;/u&gt;와 &lt;u&gt;Section 6.3&lt;/u&gt;에서 참조할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;센서가 0x12 데이터 유형의 임베디드된 데이터만 보낼 수 있는 경우, i.MX 8M 시리즈 프로세서에서 지원할 수 없다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Embedded data support&quot; href=&quot;https://devdockr.tistory.com/2365&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Interlaced sensor support and De-interlacing&quot; href=&quot;https://devdockr.tistory.com/2367&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/i.MX 8M Series MIPI Capture System</category>
      <category>AN13857</category>
      <category>Embedded data support</category>
      <category>i.MX</category>
      <category>MIPI Capture System</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2366</guid>
      <comments>https://devdockr.tistory.com/2366#entry2366comment</comments>
      <pubDate>Tue, 11 Apr 2023 12:42:18 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Series MIPI Capture System(AN13857) - Porting new camera</title>
      <link>https://devdockr.tistory.com/2365</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;MIPI capture capabilities&quot; href=&quot;https://devdockr.tistory.com/2364&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Embedded data support&quot; href=&quot;https://devdockr.tistory.com/2366&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6 Porting&amp;nbsp;new&amp;nbsp;camera&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션에서는 i.MX 8M 시리즈 프로세서에 새로운 카메라를 포팅하는 방법을 설명한다. i.MX 8M 시리즈 MIPI 캡처 시스템을 구성하는 방법을 보여주기 위해 AR0144(1280x800@60fps, RAW12, 2 레인, 레인당 445.5 Mbps)를 예로 들었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;기본 BSP 릴리스를 통하여, 8M 시리즈 MIPI 캡처 시스템은 YUV422 형식 카메라 입력만 지원할 수 있다. 이 섹션에서는 RAW8, RAW10, RAW12, RGB565, RGB888과 같은 다른 형식의 카메라 입력을 지원하는 방법을 보여준다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.1 &lt;a name=&quot;1&quot;&gt;&lt;/a&gt;Sensor&amp;nbsp;initialization&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 다음 단계를 통해 센서가 제대로 작동하는지 확인해야 한다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 공급 전압을 확인한다.&lt;/li&gt;
&lt;li&gt;센서의 MCLK 주파수를 확인한다.&lt;/li&gt;
&lt;li&gt;리셋과 파워 시퀀스를 확인한다.&lt;/li&gt;
&lt;li&gt;센서와 SoC 사이의 I2C 통신이 작동하는지 확인한다.&lt;/li&gt;
&lt;li&gt;센서 초기화 레지스터가 올바르게 구성되었는지 확인한다.&lt;/li&gt;
&lt;li&gt;센서 데이터 레인과 클럭 레인 신호를 확인한다.&lt;/li&gt;
&lt;li&gt;센서 출력 스트림이 SoC MIPI 캡처 기능 내에 있는지 확인한다(&lt;u&gt;Section 5&lt;/u&gt; 참조).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.2 &lt;a name=&quot;1&quot;&gt;&lt;/a&gt;MIPI&amp;nbsp;CSI-2&amp;nbsp;Rx&amp;nbsp;subsystem&amp;nbsp;configuration&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 사용자는 센서 출력에 따라 i.MX 8M 시리즈 MIPI CSI-2 Rx 서브시스템을 구성해야 한다. 이러한 모든 구성은 Linux dts와 MIPI CSI-2 드라이버에서 수행할 수 있다. 그리고 사용자는 관련 레지스터 필드의 값을 읽어 이러한 파라미터가 올바르게 구성되었는지 확인할 수 있다(&lt;u&gt;Section&amp;nbsp;3.1.6&lt;/u&gt;과 &lt;u&gt;Section&amp;nbsp;3.2.6&lt;/u&gt;, &amp;ldquo;Register Definition&amp;rdquo; 참조).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ CSI-2 DPHY에서 데이터 레인 수를 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Table&amp;nbsp;38.&amp;nbsp;The&amp;nbsp;number&amp;nbsp;of&amp;nbsp;data&amp;nbsp;lanes&amp;nbsp;in&amp;nbsp;CSI-2&amp;nbsp;DPHY&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;th style=&quot;width: 15%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SoC&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Register&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Field&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 15%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Value&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 15%; text-align: center; height: 68px;&quot; rowspan=&quot;2&quot;&gt;i.MX&amp;nbsp;8MQ&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center; height: 34px;&quot;&gt;&lt;i&gt;&lt;b&gt;CSI2RX_CFG_NUM_LANES&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center; height: 34px;&quot;&gt;1-0 &lt;br /&gt;csi2rx_cfg_num_lanes&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left; height: 34px;&quot;&gt;01b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 35%; text-align: center; height: 34px;&quot;&gt;&lt;i&gt;&lt;b&gt;CSI2RX_CFG_DISABLE_DATA_LANES&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center; height: 34px;&quot;&gt;3-0 &lt;br /&gt;csi2rx_cfg_disable_data_lanes&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left; height: 34px;&quot;&gt;1100b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 15%; text-align: center; height: 34px;&quot; rowspan=&quot;2&quot;&gt;i.MX&amp;nbsp;8MM &lt;br /&gt;i.MX&amp;nbsp;8MN &lt;br /&gt;i.MX&amp;nbsp;8MP&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center; height: 17px;&quot;&gt;&lt;i&gt;&lt;b&gt;MIPI_CSIx_CSIS_COMMON_CTRL&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center; height: 17px;&quot;&gt;9-8 &lt;br /&gt;LANE_NUMBER&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left; height: 17px;&quot;&gt;01b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 35%; text-align: center; height: 17px;&quot;&gt;&lt;i&gt;&lt;b&gt;MIPI_CSIx_DPHY_COMMON_CTRL&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center; height: 17px;&quot;&gt;4-1 &lt;br /&gt;ENABLE_DAT&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left; height: 17px;&quot;&gt;0011b&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;i&gt;이 섹션에서 모든 테이블의 &quot;value&quot; 열은 AR0144에 대한 레퍼런스 설정을 보여준다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 센서의 데이터 속도에 따라 CSI-2 DPHY에서 high-speed&amp;nbsp;settle&amp;nbsp;timer를 구성한다(&lt;u&gt;Section 3.1.5&lt;/u&gt;와 &lt;u&gt;Section 3.2.5&lt;/u&gt;, &amp;ldquo;DPHY High-Speed Settle Timer&amp;rdquo; 참조).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Table&amp;nbsp;39.&amp;nbsp;High-speed&amp;nbsp;settle&amp;nbsp;timer&amp;nbsp;in&amp;nbsp;CSI-2&amp;nbsp;DPHY&amp;nbsp;according&amp;nbsp;to&amp;nbsp;the&amp;nbsp;data&amp;nbsp;rate&amp;nbsp;of&amp;nbsp;sensor&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 15%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SoC&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Register&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Field&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 15%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Value&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%; text-align: center;&quot;&gt;i.MX&amp;nbsp;8MQ&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;&lt;i&gt;&lt;b&gt;IOMUXC_GPR_GPR34/41&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;7&amp;ndash;2 &lt;br /&gt;CSI2_x_S_PRG_RXHS_SETTLE&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left;&quot;&gt;0x6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%; text-align: center;&quot;&gt;i.MX&amp;nbsp;8MM &lt;br /&gt;i.MX&amp;nbsp;8MN &lt;br /&gt;i.MX&amp;nbsp;8MP&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;&lt;i&gt;&lt;b&gt;MIPI_CSIx_DPHY_COMMON_CTRL&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;31-24 &lt;br /&gt;HSSETTLE&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left;&quot;&gt;0x9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ CSI-2 컨트롤러에서 이미지 데이터 유형, 수직/수평 이미지 해상도를 구성한(i.MX 8MM, i.MX 8MN, i.MX 8MP에만 해당).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Table&amp;nbsp;40.&amp;nbsp;The&amp;nbsp;image&amp;nbsp;data&amp;nbsp;type,&amp;nbsp;vertical/horizontal&amp;nbsp;image&amp;nbsp;resolution&amp;nbsp;in&amp;nbsp;CSI-2&amp;nbsp;controller&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 15%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SoC&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Register&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Field&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 15%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Value&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%; text-align: center;&quot; rowspan=&quot;3&quot;&gt;i.MX&amp;nbsp;8MM &lt;br /&gt;i.MX&amp;nbsp;8MN &lt;br /&gt;i.MX&amp;nbsp;8MP&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;&lt;i&gt;&lt;b&gt;MIPI_CSIx_ISP_CONFIG0&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;7&amp;ndash;2 &lt;br /&gt;DATAFORMAT&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left;&quot;&gt;0x2C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot; rowspan=&quot;2&quot;&gt;&lt;i&gt;&lt;b&gt;MIPI_CSIx_ISP_RESOLUTION0&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;31-16 &lt;br /&gt;VRESOL&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left;&quot;&gt;0x320&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;15-0 &lt;br /&gt;HRESOL&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left;&quot;&gt;0x500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Gasket에서 이미지 데이터 유형, 수직/수평 이미지 해상도를 구성한다(i.MX 8MN, i.MX 8MP에만 해당).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Table&amp;nbsp;41.&amp;nbsp;The&amp;nbsp;image&amp;nbsp;data&amp;nbsp;type,&amp;nbsp;vertical/horizontal&amp;nbsp;image&amp;nbsp;resolution&amp;nbsp;in&amp;nbsp;Gasket&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 15%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SoC&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Register&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Field&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 15%; height: 18px;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Value&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%; text-align: center;&quot; rowspan=&quot;3&quot;&gt;i.MX 8MN &lt;br /&gt;i.MX&amp;nbsp;8MP&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;&lt;i&gt;&lt;b&gt;GASKET_x_CTRL&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;13-8 &lt;br /&gt;GASKET_x_DATA_TYPE&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left;&quot;&gt;0x2C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;&lt;i&gt;&lt;b&gt;GASKET_x_HSIZE&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;31-0 &lt;br /&gt;GASKET_x_HSIZE&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left;&quot;&gt;0x500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;&lt;i&gt;&lt;b&gt;GASKET_x_VSIZE&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;31-0 &lt;br /&gt;GASKET_x_VSIZE&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: left;&quot;&gt;0x320&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.3 &lt;a name=&quot;1&quot;&gt;&lt;/a&gt;Imaging&amp;nbsp;subsystem&amp;nbsp;configuration&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 사용자는 센서 출력, 특히 형식과 이미지 크기 관련 레지스터 필드에 따라 i.MX 8M 시리즈 이미징 서브시스템을 구성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6.3.1 i.MX&amp;nbsp;8MQ/i.MX&amp;nbsp;8MM&amp;nbsp;CSI&amp;nbsp;bridge&amp;nbsp;configuration&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAW, RGB 또는 YUV 형식 카메라 입력을 지원하려면 다음 CSI Bridge 레지스터 필드를 올바르게 구성해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;CSI_CR3[SENSOR_16BITS]&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;CSI_CR18[PARALLEL24_EN]&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;CSI_CR18[MIPI_DATA_FORMAT]&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;Table 42&lt;/u&gt;는 RAW, RGB, YUV 형식의 센서를 지원하도록 CSI Bridge를 구성하는 방법을 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Table&amp;nbsp;42.&amp;nbsp;CSI&amp;nbsp;Bridge&amp;nbsp;configuration&amp;nbsp;for&amp;nbsp;RAW,&amp;nbsp;RGB,&amp;nbsp;and&amp;nbsp;YUV&amp;nbsp;format&amp;nbsp;sensor&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 22%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Sensor&amp;nbsp;Format&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 26%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;CSI_CR3 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;[SENSOR_16BITS]&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 26%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;CSI_CR18 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;[PARALLEL24_EN]&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 26%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;CSI_CR18 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;[MIPI_DATA_FORMAT]&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22%; text-align: center;&quot;&gt;RAW8&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0x2A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22%; text-align: center;&quot;&gt;RAW10&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0x2B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22%; text-align: center;&quot;&gt;RAW12&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0x2C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22%; text-align: center;&quot;&gt;RGB565&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0x22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22%; text-align: center;&quot;&gt;RGB888&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0x24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22%; text-align: center;&quot;&gt;YUV422&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;0x1E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;YUV422 형식 지원과 관련하여 i.MX 8MQ와 i.MX 8MM 사이에는 약간의 차이가 있다. i.MX 8MQ에서 YUV422 형식 센서의 경우, &lt;b&gt;CSI_CR3[SENSOR_16BITS]&lt;/b&gt;를 1로 설정해야 한다. i.MX 8MM에서 YUV422 형식 센서의 경우, &lt;b&gt;CSI_CR3[SENSOR_16BITS]&lt;/b&gt;를 0(단일 픽셀 모드) 또는 1(듀얼 픽셀 모드)로 설정할 수 있다. YUV422 형식의 듀얼 픽셀 모드를 지원하려면, &lt;b&gt;CSI_CR18[MIPI_DOUBLE_CMPNT]&lt;/b&gt;를 1로 설정하고 &lt;b&gt;MIPI_CSIx_ISP_CONFIG0[PIXEL_MODE]&lt;/b&gt;를 01b로 설정해야 한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, &lt;i&gt;&lt;b&gt;CSI_IMAG_PARA[IMAGE_WIDTH, IMAGE_HEIGHT]&lt;/b&gt;&lt;/i&gt; 필드는 활성 센서 출력 크기에 따라 올바르게 구성되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6.3.2 i.MX&amp;nbsp;8MN/i.MX&amp;nbsp;8MP&amp;nbsp;ISI&amp;nbsp;configuration&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RGB 또는 YUV 형식 입력의 경우, ISI 블럭은 형식 변환(예: YUV422에서 YUV420으로)과 색 공간 변환(예: RGB에서 YUV로)을 지원할 수 있다. 그러나 RAW 형식 입력의 경우 픽셀 변경 없이 메모리에 복사된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISI 출력 형식은 &lt;i&gt;&lt;b&gt;CHNL_IMG_CTRL[FORMAT]&lt;/b&gt;&lt;/i&gt;에서 구성되며, &lt;u&gt;Table 43&lt;/u&gt;은 RAW, RGB, YUV 형식 센서를 지원하도록 ISI를 구성하는 방법을 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Table&amp;nbsp;43.&amp;nbsp;ISI&amp;nbsp;configuration&amp;nbsp;for&amp;nbsp;RAW,&amp;nbsp;RGB,&amp;nbsp;and&amp;nbsp;YUV&amp;nbsp;format&amp;nbsp;sensor&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 30%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;th style=&quot;width: 35%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Sensor&amp;nbsp;Format&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 35%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;CHNL_IMG_CTRL[FORMAT]&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%; text-align: center;&quot; rowspan=&quot;3&quot;&gt;No&amp;nbsp;processing&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;RAW10&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;001100b&amp;nbsp;-&amp;nbsp;RAW10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;RGB888&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;000110b&amp;nbsp;-&amp;nbsp;RGB888P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;YUV422&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;100000b&amp;nbsp;-&amp;nbsp;YUV422_1P8P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%; text-align: center;&quot;&gt;Format&amp;nbsp;Conversion&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;YUV422&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;110001b&amp;nbsp;-&amp;nbsp;YUV420_2P8P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30%; text-align: center;&quot; rowspan=&quot;2&quot;&gt;Color&amp;nbsp;Space&amp;nbsp;Conversion&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;YUV422&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;000110b&amp;nbsp;-&amp;nbsp;RGB888P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;RGB565&lt;/td&gt;
&lt;td style=&quot;width: 35%; text-align: center;&quot;&gt;100000b&amp;nbsp;-&amp;nbsp;YUV422_1P8P&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;프로세싱하지 않는 경우, &lt;b&gt;CHNL_IMG_CTRL[FORMAT]&lt;/b&gt;은 입력 카메라 센서와 동일한 형식으로 설정해야 한다. 형식 변환과 색 공간 변환 사례의 경우, &lt;u&gt;Table 43&lt;/u&gt;에 레퍼런스 ISI 설정이 나열되어 있다. 더 많은 출력 형식이 지원될 수 있다. &lt;u&gt;Section 4.2&lt;/u&gt;, &amp;ldquo;Register Definition&amp;rdquo;의 &lt;b&gt;CHNL_IMG_CTRL[FORMAT]&lt;/b&gt; 필드 설명을 참조한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, &lt;i&gt;&lt;b&gt;CHNL_IMG_CFG[HEIGHT, WIDTH]&lt;/b&gt;&lt;/i&gt; 필드는 활성 센서 출력 크기에 따라 올바르게 구성되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.4 &lt;a name=&quot;1&quot;&gt;&lt;/a&gt;Debug&amp;nbsp;tips&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8M 시리즈 프로세서에 새로운 카메라를 포팅할 때, 사용자는 캡처 중단 문제를 마주칠 수 있다. 즉, 센서 데이터를 메모리에 저장할 수 없다. 사용자는 아래 단계에 따라 이 문제를 디버깅할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MIPI CSI-2 Rx 서브시스템의 인터럽트 상태 확인&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;i.MX 8MQ의 경우, &lt;i&gt;&lt;b&gt;CSI2RX_IRQ_STATUS&lt;/b&gt;&lt;/i&gt; 레지스터 확인&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;DPHY ErrSotHS 및/또는 ErrSotSync_HS 오류가 트리거되면, &lt;i&gt;&lt;b&gt;hs_settle&lt;/b&gt;&lt;/i&gt;이 올바르게 구성되었는지 확인한다.&lt;/li&gt;
&lt;li&gt;다른 오류가 트리거되면, 카메라 스트림이 안정적이고 MIPI 사양을 준수하는지 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;i.MX 8MM/i.MX 8MN/i.MX 8MP의 경우, &lt;i&gt;&lt;b&gt;MIPI_CSIx_DPHY_STATUS&lt;/b&gt;&lt;/i&gt;와 &lt;i&gt;&lt;b&gt;MIPI_CSIx_INTERRUPT_SOURCE_0&lt;/b&gt;&lt;/i&gt; 레지스터 확인&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;4레인 카메라가 연결된 경우, &lt;i&gt;&lt;b&gt;MIPI_CSIx_DPHY_STATUS[STOPSTATEDAT]&lt;/b&gt;&lt;/i&gt;는 0x0과 0xF 사이에서 변경되어야 한다.&lt;/li&gt;
&lt;li&gt;연결된 카메라가 비연속 클럭 모드에서 작동하는 경우, &lt;i&gt;&lt;b&gt;MIPI_CSIx_DPHY_STATUS [STOPSTATECLK]&lt;/b&gt;&lt;/i&gt;는 0과 1 사이에서 변경되어야 한다. 연결된 카메라가 연속 클럭 모드에서 작동하는 경우, 항상 0이어야 한다.&lt;/li&gt;
&lt;li&gt;데이터 레인이나 클럭 레인이 정지 상태나 ULPS 상태로 남아 있으면, 정상적으로 카메라가 잘 작동하지 않는 것이다. 센서 데이터 레인과 클럭 레인 신호를 확인하고 MIPI 사양을 준수하는지 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;i.MX 8MM, i.MX 8MN, i.MX 8MP는 Rx DPHY를 활성화하기 전에 연결된 카메라가 LP 상태에서 작동해야 한다. 그러나 카메라가 연속 클럭 모드에서 작동하는 경우, 클럭 레인은 항상 HS 모드에 있을 수 있다. 이 경우, Rx DPHY는 HS 모드를 감지하지 못하고 중지나 ULPS 상태로 잘못 유지될 수 있다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;MIPI_CSIx_INTERRUPT_SOURCE_0[ERR_SOT_HS]&lt;/b&gt;&lt;/i&gt;가 어설션되면, &lt;i&gt;&lt;b&gt;hs_settle&lt;/b&gt;&lt;/i&gt;이 올바르게 구성되었는지 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;MIPI_CSIx_INTERRUPT_SOURCE_0[ERR_OVER]&lt;/b&gt;&lt;/i&gt;가 어설션되면, 카메라 데이터 속도를 낮춘다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;MIPI_CSIx_INTERRUPT_SOURCE_0[FRAME_START/FRAME_END]&lt;/b&gt;&lt;/i&gt;가 어설션되지 않거나 다른 오류가 어설션되면, 센서가 안정적으로 작동하는지 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Imaging 서브시스템의 인터럽트 상태를 확인한다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;i.MX 8MQ, i.MX 8MM의 경우, CSI_SR 레지스터를 확인한다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;캡처 파이프라인이 제대로 작동하는 경우, &lt;i&gt;&lt;b&gt;DMA_TSF_DONE_FB1&lt;/b&gt;&lt;/i&gt;와 &lt;i&gt;&lt;b&gt;DMA_TSF_DONE_FB2&lt;/b&gt;&lt;/i&gt; 인터럽트가 차례로 트리거되어야 하며 이러한 각 인터럽트 사이의 시간 간격은 입력 카메라 스트림의 프레임 간격과 동일해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;SOF_INT&lt;/b&gt;&lt;/i&gt; 및/또는 &lt;i&gt;&lt;b&gt;EOF_INT&lt;/b&gt;&lt;/i&gt;가 어설션되지 않으면, CSI Bridge가 MIPI CSI-2 Rx 서브시스템에서 데이터를 수신할 수 없다는 것을 의미한다. 카메라와 MIPI CSI-2 Rx 서브시스템이 올바르게 구성되었는지 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;BASEADDR_CHHANGE_ERROR&lt;/b&gt;&lt;/i&gt;가 여러 번 트리거되면, 일반적으로 CSI Bridge의 크기 및/또는 형식 관련 레지스터가 제대로 구성되지 않았다는 것을 나타낸다. 사용자는 &lt;i&gt;&lt;b&gt;CSI_CR18[BASEADDR_SWITCH_EN]&lt;/b&gt;&lt;/i&gt;에 0을 설정하여 이 인터럽트를 비활성화할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;RF_OR_INT&lt;/b&gt;&lt;/i&gt;가 어설션되면, 카메라 데이터 속도를 낮춘다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;i.MX 8MQ의 경우, CSI Bridge Rx FIFO 오버플로로 인해 시스템 중단이 발생할 수 있는 알려진 문제가 있다. 자세한 내용과 해결 방법은 ERR050384를 확인한다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;i.MX 8MN, i.MX 8MP의 경우, &lt;i&gt;&lt;b&gt;CHNL_STS&lt;/b&gt;&lt;/i&gt; 레지스터를 확인한다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;캡처 파이프라인이 잘 작동하는 경우, &lt;i&gt;&lt;b&gt;BUF1_ACTIVE&lt;/b&gt;&lt;/i&gt;와 &lt;i&gt;&lt;b&gt;BUF2_ACTIVE&lt;/b&gt;&lt;/i&gt; 비트가 차례로 어설션되어야 한다. 그리고 각 &lt;i&gt;&lt;b&gt;FRM_STRD&lt;/b&gt;&lt;/i&gt; 인터럽트의 시간 간격은 카메라 입력 스트림의 프레임 간격과 동일해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;LINE_STRD&lt;/b&gt;&lt;/i&gt;와 &lt;i&gt;&lt;b&gt;FRM_STRD&lt;/b&gt;&lt;/i&gt;가 어설션되지 않으면, ISI가 MIPI CSI-2 Rx 서브시스템에서 데이터를 수신할 수 없다는 것을 의미한다. 카메라와 MIPI CSI-2 Rx 서브시스템이 올바르게 구성되었는지 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;OFLW_Y/U/V_BUF&lt;/b&gt;&lt;/i&gt; 오류가 어설션되면, 카메라 데이터 속도를 낮춘다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;MIPI capture capabilities&quot; href=&quot;https://devdockr.tistory.com/2364&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Embedded data support&quot; href=&quot;https://devdockr.tistory.com/2366&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/i.MX 8M Series MIPI Capture System</category>
      <category>AN13857</category>
      <category>i.MX</category>
      <category>MIPI Capture System</category>
      <category>Porting new camera</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2365</guid>
      <comments>https://devdockr.tistory.com/2365#entry2365comment</comments>
      <pubDate>Tue, 11 Apr 2023 10:06:28 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Series MIPI Capture System(AN13857) - MIPI capture capabilities</title>
      <link>https://devdockr.tistory.com/2364</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Imaging subsystem&quot; href=&quot;https://devdockr.tistory.com/2362&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Porting new camera&quot; href=&quot;https://devdockr.tistory.com/2365&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5 MIPI&amp;nbsp;capture&amp;nbsp;capabilities&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;Table 37&lt;/u&gt;은 8M 시리즈 프로세서의 MIPI 캡처 기능을 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Table&amp;nbsp;37.&amp;nbsp;Bandwidth&amp;nbsp;of&amp;nbsp;i.MX&amp;nbsp;8M&amp;nbsp;Series&amp;nbsp;Capture&amp;nbsp;System&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 10%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;SoC&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 16%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Camera&amp;nbsp;interface&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 16%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Capture&amp;nbsp;controller&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 27%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Max&amp;nbsp;total&amp;nbsp;DPHY&amp;nbsp;bandwidth&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;width: 26%;&quot; bgcolor=&quot;#0B173B&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;Max&amp;nbsp;Rx&amp;nbsp;pixel&amp;nbsp;clock&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;i.MX&amp;nbsp;8MQ&lt;/td&gt;
&lt;td style=&quot;width: 16%; text-align: center;&quot;&gt;2&amp;nbsp;x&amp;nbsp;MIPI&amp;nbsp;CSI-2 &lt;br /&gt;(4&amp;nbsp;lane&amp;nbsp;each)&lt;/td&gt;
&lt;td style=&quot;width: 16%; text-align: center;&quot;&gt;2&amp;nbsp;x&amp;nbsp;CSI&amp;nbsp;Bridge&lt;/td&gt;
&lt;td style=&quot;width: 27%; text-align: center;&quot;&gt;각각 1.5 Gbps x 4&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;각각 333 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;i.MX&amp;nbsp;8MM&lt;/td&gt;
&lt;td style=&quot;width: 16%; text-align: center;&quot;&gt;1&amp;nbsp;x&amp;nbsp;MIPI&amp;nbsp;CSI-2 &lt;br /&gt;(4&amp;nbsp;lane)&lt;/td&gt;
&lt;td style=&quot;width: 16%; text-align: center;&quot;&gt;1&amp;nbsp;x&amp;nbsp;CSI&amp;nbsp;Bridge&lt;/td&gt;
&lt;td style=&quot;width: 27%; text-align: center;&quot;&gt;1.5&amp;nbsp;Gbps&amp;nbsp;x&amp;nbsp;4&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;333&amp;nbsp;MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;i.MX&amp;nbsp;8MN&lt;/td&gt;
&lt;td style=&quot;width: 16%; text-align: center;&quot;&gt;1&amp;nbsp;x&amp;nbsp;MIPI&amp;nbsp;CSI-2 &lt;br /&gt;(4&amp;nbsp;lane)&lt;/td&gt;
&lt;td style=&quot;width: 16%; text-align: center;&quot;&gt;1&amp;nbsp;x&amp;nbsp;ISI&lt;/td&gt;
&lt;td style=&quot;width: 27%; text-align: center;&quot;&gt;1.5&amp;nbsp;Gbps&amp;nbsp;x&amp;nbsp;4&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;333&amp;nbsp;MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10%; text-align: center;&quot;&gt;i.MX&amp;nbsp;8MP&lt;/td&gt;
&lt;td style=&quot;width: 16%; text-align: center;&quot;&gt;2&amp;nbsp;x&amp;nbsp;MIPI&amp;nbsp;CSI-2 &lt;br /&gt;(4&amp;nbsp;lane&amp;nbsp;each)&lt;/td&gt;
&lt;td style=&quot;width: 16%; text-align: center;&quot;&gt;2&amp;nbsp;x&amp;nbsp;ISI&lt;/td&gt;
&lt;td style=&quot;width: 27%; text-align: center;&quot;&gt;각각 1.5 Gbps x 4&lt;/td&gt;
&lt;td style=&quot;width: 26%; text-align: center;&quot;&gt;CSI Port 1에서 싱글 카메라&lt;br /&gt;500&amp;nbsp;MHz&lt;br /&gt;CSI Port 2에서 싱글 카메라&lt;br /&gt;266&amp;nbsp;MHz&lt;br /&gt;듀얼 카메라의 경우&lt;br /&gt;각각 266&amp;nbsp;MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;들어오는 카메라 데이터 속도와 픽셀 클럭은 Rx DPHY 대역폭과 픽셀 클럭보다 작거나 같아야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;카메라 데이터 속도&amp;nbsp;&amp;le; Rx DPHY 대역폭&lt;/li&gt;
&lt;li&gt;카메라 픽셀 클럭&amp;nbsp;&amp;le; Rx 픽셀 클럭&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라 데이터 속도(bps)와 픽셀 클럭(Hz)은 다음과 같이 계산할 수 있다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pixel&amp;nbsp;Clock&amp;nbsp;=&amp;nbsp;H_total&amp;nbsp;*&amp;nbsp;V&amp;nbsp;_total&amp;nbsp;*&amp;nbsp;FPS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Data&amp;nbsp;Rate&amp;nbsp;=&amp;nbsp;Pixel&amp;nbsp;Clock*&amp;nbsp;BPP&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;H_total&lt;/b&gt; = 총 라인 너비 (픽셀 단위) = active&amp;nbsp;pixels&amp;nbsp;+&amp;nbsp;horizontal&amp;nbsp;blanking&amp;nbsp;pixels&lt;/li&gt;
&lt;li&gt;&lt;b&gt;V_total&lt;/b&gt; = 총 프레임 높이 (라인 단위) = active lines + vertical blanking lines&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FPS&lt;/b&gt; = 초당 프레임 수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BPP&lt;/b&gt; = 픽셀당 비트 수&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;위의 대역폭 제한 외에도 ISI 블럭에는 추가 너비 제한이 있다(&lt;u&gt;Section 4.2.3&lt;/u&gt; 참조). ERR011326와 ERR050384는 i.MX 8MQ MIPI 캡처 시스텀의 대역폭을 제한한다. i.MX 8MP에서 CSI-2 포트 1이 CSI-2 포트 2보다 대역폭이 더 크다는 사실에 주의해야 한다. 모든 i.MX 8M 시리즈 프로세서는 단일 MIPI CSI-2 인터페이스를 통해 동시에 전송되는 여러 카메라 스트림을 지원할 수 없다. 즉, i.MX 8M 시리즈 프로세서에서는 다중 가상 채널을 지원할 수 없다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;Imaging subsystem&quot; href=&quot;https://devdockr.tistory.com/2362&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2358&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;Porting new camera&quot; href=&quot;https://devdockr.tistory.com/2365&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/i.MX 8M Series MIPI Capture System</category>
      <category>AN13857</category>
      <category>i.MX</category>
      <category>MIPI capture capabilities</category>
      <category>MIPI Capture System</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2364</guid>
      <comments>https://devdockr.tistory.com/2364#entry2364comment</comments>
      <pubDate>Mon, 10 Apr 2023 15:06:57 +0900</pubDate>
    </item>
    <item>
      <title>i.MX 8M Plus 개발 환경 구축 - U-Boot 빌드</title>
      <link>https://devdockr.tistory.com/2363</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;커널 빌드&quot; href=&quot;https://devdockr.tistory.com/2259&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;커널 사용자 지정&quot; href=&quot;https://devdockr.tistory.com/2369&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;U-Boot 빌드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 U-Boot를 다운로드/빌드/로드하는 방법을 설명한다.&amp;nbsp;&lt;b&gt;IMXBSPPG&lt;/b&gt;&amp;nbsp;설명을 기반으로&amp;nbsp;독립 실행형 환경과 Yocto Project로 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 이미 &lt;a title=&quot;Yocto Project 설정&quot; href=&quot;https://devdockr.tistory.com/2251&quot;&gt;Yocto Project 설정&lt;/a&gt;을 했으므로, Yocto Project 설정 부분은 설명 없이 넘어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;독립 실행형 환경(standalone envirnoment)에서 U-Boot 빌드&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;작업 전 준비 사항&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독립 실행형 환경에서 U-Boot를 빌드하려면, 먼저 호스트 시스템에 설치하여 컴파일하기 위한 개발용 SDK(툴, 툴 체인, 작은 rootfs 포함)를 생성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 이미지를 생성 후, SDK를 생성하는 것을 권장한다. SDK부터 생성하려고 하면 에러가 발생할 수 있다(에러가 발생하는 이유를 찾지 못 했다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예로, 아래과 같이 먼저 이미지를 생성하고,&lt;/p&gt;
&lt;pre id=&quot;code_1672040106536&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ DISTRO=fsl-imx-wayland MACHINE=imx8mp-lpddr4-evk source imx-setup-release.sh -b bld-full
$ bitbake imx-image-full&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 SDK를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1672040153040&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake imx-image-full -c populate_sdk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK가 에러 없이 생성이 되면, 빌드 디렉토리의 &lt;b&gt;tmp/deploy/sdk&lt;/b&gt;에서 &lt;b&gt;.sh&lt;/b&gt; 파일을 빌드하려는 호스트 시스템으로 복사하고, 해당 파일을 실행하면 SDK를 설치할 수 있다. 기본 설치 위치는 &lt;b&gt;/opt&lt;/b&gt;이지만, 호스트 시스템 어디에나 설치할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;호스트 시스템에서 U-Boot 빌드 단계&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ i.MX 8 SoC용 U-Boot를 빌드하기 전에 아래 커맨드를 실행하여 호스트 환경을 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ⓐ&amp;nbsp;5.15-kirkstone를 사용하는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1681432514711&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ source /opt/fsl-imx-wayland/5.15-kirkstone/environment-setup-armv8a-poky-linux
$ export ARCH=arm64&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ⓑ&amp;nbsp;6.1-langdale를 사용하는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1681432580437&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source /opt/fsl-imx-wayland/6.1-langdale/environment-setup-armv8a-poky-linux
export ARCH=arm64&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 다음 커맨드를 실행하여 저장소에서 U-Boot 소스를 다운로드한다(현재 저장소에서 기본 버전은 lf_v2022.04이다).&lt;/p&gt;
&lt;pre id=&quot;code_1681432745805&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone https://github.com/nxp-imx/uboot-imx
또는
$ git clone https://github.com/nxp-imx/uboot-imx -b lf_v2022.04&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 다운로드한 디렉토리로 이동하여, 다음 커맨드를 실행하여 U-Boot를 빌드한다.&lt;/p&gt;
&lt;pre id=&quot;code_1681432939904&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd uboot-imx
$ make distclean
$ make imx8mp_evk_defconfig
$ make&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드시 아래와 같은 에러가 발생하면,&lt;/p&gt;
&lt;pre id=&quot;code_1681433043052&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tools/mkeficapsule.c:21:10: fatal error: gnutls/gnutls.h: No such file or directory&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 패키지를 설치하여 다시 &lt;i&gt;&lt;b&gt;make&lt;/b&gt;&lt;/i&gt;를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1681433070396&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install libgnutls28-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드가 완료되면 &lt;i&gt;&lt;b&gt;uboot-imx/&lt;/b&gt;&lt;/i&gt; 디렉토리에 &lt;i&gt;&lt;b&gt;u-boot.bin&lt;/b&gt;&lt;/i&gt;이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;imx-mkimage를 사용하여 imx-boot 이미지 빌드 단계&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 아래의 커맨드를 실행하여 저장소에서 imx-mkimage를 다운로드한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ⓐ 5.15-kirkstone를 사용하는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1681437106326&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone https://github.com/nxp-imx/imx-mkimage.git -b lf-5.15.32_2.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ⓑ 6.1-langdale를 사용하는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1681437237779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone https://github.com/nxp-imx/imx-mkimage.git -b lf-6.1.1_1.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;imx-mkimage 디렉토리가 생성되면서 파일들이 다운로드된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 아래의 단계별로 필요한 파일들을 복사한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;u-boot/tools/mkimage&lt;/b&gt;&lt;/i&gt;를 &lt;i&gt;&lt;b&gt;imx-mkimage/iMX8M/mkimage_uboot&lt;/b&gt;&lt;/i&gt;로 이름을 변경하여 복사한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;u-boot/spl/u-boot-spl.bin&lt;/b&gt;&lt;/i&gt;을&amp;nbsp;&lt;i&gt;&lt;b&gt;imx-mkimage/iMX8M/&lt;/b&gt;&lt;/i&gt;로 복사한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;u-boot/u-boot-nodtb.bin&lt;/b&gt;&lt;/i&gt;을 &lt;i&gt;&lt;b&gt;imx-mkimage/iMX8M/&lt;/b&gt;&lt;/i&gt;로 복사한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;u-boot/arch/arm/dts/imx8mp-evk.dtb&lt;/b&gt;&lt;/i&gt;를 &lt;i&gt;&lt;b&gt;imx-mkimage/iMX8M/&lt;/b&gt;&lt;/i&gt;로 복사한다.&lt;/li&gt;
&lt;li&gt;Arm Trusted Firmware(imx-atf) &lt;i&gt;&lt;b&gt;bl31.bin&lt;/b&gt;&lt;/i&gt;을 &lt;i&gt;&lt;b&gt;imx-mkimage/iMX8M/&lt;/b&gt;&lt;/i&gt;로 복사한다(Yocto Project의&amp;nbsp;&lt;i&gt;&lt;b&gt;/tmp/deploy/images/imx8mp-lpddr4-evk/imx-boot-tools/bl31-imx8mp.bin&lt;/b&gt;&lt;/i&gt;를 이름을 변경하여 복사한다).&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;firmware-imx&lt;/b&gt;&lt;/i&gt; 패키지의&amp;nbsp;&lt;i&gt;&lt;b&gt;signed_hdmi_imx8m.bin&lt;/b&gt;&lt;/i&gt;을 &lt;i&gt;&lt;b&gt;imxmkimage/iMX8M/&lt;/b&gt;&lt;/i&gt;로 복사한다(Yocto Project의 &lt;b&gt;&lt;i&gt;/tmp/deploy/images/imx8mp-lpddr4-evk/imx-boot-tools/signed_hdmi_imx8m.bin&lt;/i&gt;&lt;/b&gt;).&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;firmware-imx&lt;/b&gt;&lt;/i&gt; 패키지의 &lt;i&gt;&lt;b&gt;lpddr4_pmu_train_1d_dmem_202006.bin&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;lpddr4_pmu_train_1d_imem_202006.bin&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;lpddr4_pmu_train_2d_dmem_202006.bin&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;lpddr4_pmu_train_2d_imem_202006.bin&lt;/b&gt;&lt;/i&gt;을 &lt;i&gt;&lt;b&gt;imx-mkimage/iMX8M/&lt;/b&gt;&lt;/i&gt;로 복사한다(&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Yocto Project의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;/tmp/deploy/images/imx8mp-lpddr4-evk/imx-boot-tools/&lt;/i&gt;&lt;/b&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 다음 커맨드를 실행하여 &lt;i&gt;&lt;b&gt;imx-boot-image&lt;/b&gt;&lt;/i&gt;를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1681442859044&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make SOC=iMX8MP flash_evk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;imx-boot-image&lt;/b&gt;&lt;/i&gt;인 &lt;i&gt;&lt;b&gt;flash.bin&lt;/b&gt;&lt;/i&gt;이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Yocto Project에서 U-boot 빌드와 로드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;/tmp/work/imx8mp_lpddr4_evk-poky-linux/u-boot-imx/2022.04-r0/git/&lt;/b&gt;&lt;/i&gt;에서 필요한 작업 후 아래 커맨드를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1681443555219&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake -f -c compile u-boot-imx
$ bitbake -f -c deploy u-boot-imx
$ bitbake -f -c install u-boot-imx
$ bitbake -f -c compile imx-boot
$ bitbake -f -c install imx-boot
$ bitbake -f -c deploy imx-boot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 후 &lt;i&gt;&lt;b&gt;&amp;lt;build-dir&amp;gt;/tmp/deploy/images/imx8mp-lpddr4-evk&lt;/b&gt;&lt;/i&gt;에서 부트 바이너리 &lt;i&gt;&lt;b&gt;imx-boot-imx8mp-lpddr4-evk-sd.bin-flash_evk&lt;/b&gt;&lt;/i&gt;를 찾을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a title=&quot;커널 빌드&quot; href=&quot;https://devdockr.tistory.com/2259&quot;&gt;이전&lt;/a&gt;] [&lt;a title=&quot;목차&quot; href=&quot;https://devdockr.tistory.com/2245&quot; rel=&quot;noopener&quot;&gt;목차&lt;/a&gt;] [&lt;a title=&quot;커널 사용자 지정&quot; href=&quot;https://devdockr.tistory.com/2369&quot;&gt;다음&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NXP i.MX SoC Family/Evaluation Kit for the i.MX 8M Plus</category>
      <category>i.MX</category>
      <category>i.MX 8M Plus</category>
      <category>u-boot</category>
      <category>개발 환경 구축</category>
      <author>까마귀75</author>
      <guid isPermaLink="true">https://devdockr.tistory.com/2363</guid>
      <comments>https://devdockr.tistory.com/2363#entry2363comment</comments>
      <pubDate>Fri, 7 Apr 2023 13:38:22 +0900</pubDate>
    </item>
  </channel>
</rss>