<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Charizard/Doc</title>
    <link>https://chardoc.tistory.com/</link>
    <description>파이리의 지식 저장소</description>
    <language>ko</language>
    <pubDate>Sun, 2 Aug 2026 11:59:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Charizard</managingEditor>
    <image>
      <title>Charizard/Doc</title>
      <url>https://tistory1.daumcdn.net/tistory/2943585/attach/5d6fcddda19640008d808738e0b72f55</url>
      <link>https://chardoc.tistory.com</link>
    </image>
    <item>
      <title>실전에서 사용하는 git 명령어</title>
      <link>https://chardoc.tistory.com/25</link>
      <description>&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;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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; git branch -av&lt;/span&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;특정 브랜치/commit 으로 바꾸고 싶을 때&lt;/h4&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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git checkout [branch 명/commit number]&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;내가 있는 경로의 git remote 저장소를 알고 싶을 때&lt;/h4&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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;remote&amp;nbsp;-v&lt;/span&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;gerrit push 명령어&lt;/h4&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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;push&amp;nbsp;refs/heads/[branch&amp;nbsp;명]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;// &amp;lt;예시&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;// master 브랜치에 push 하고 싶을 경우&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;// $ git push refs/heads/master&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;gerrit push 가 안될 경우?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;rarr; commit message 에 Change-Id 가 없을 가능성이 큼.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;rarr; 관련한 명령어는 추후 추가 예정. 보통은 error 메세지에 나온 명령어 그대로 입력하고 git commit --amend 로 commit 하면 Change-Id 가 추가 되어 다시 push 를 하면 push 가 됨.&lt;/span&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;Commit 한 뒤에 Commit 한 파일을 수정하고 싶을 때&lt;/h4&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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;//&amp;nbsp;수정하고&amp;nbsp;싶은&amp;nbsp;사항&amp;nbsp;수정&amp;nbsp;후,&amp;nbsp;git&amp;nbsp;status&amp;nbsp;로&amp;nbsp;수정한&amp;nbsp;파일&amp;nbsp;확인 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;add&amp;nbsp;[수정한&amp;nbsp;파일] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;commit&amp;nbsp;--amend&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;N개 Commit 을 patch 파일로 만들고 싶을 경우&lt;/h4&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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;format-patch&amp;nbsp;-[N] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;// &amp;lt;예시&amp;gt;&lt;br /&gt;// 최신 commit 부터 3개 commit 을 patch 파일 생성하고 싶을 경우 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;// $ git format-patch -3&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* patch 파일과 diff 파일의 차이&lt;br /&gt;: git diff 로 생성판 파일은 파일을 수정한 내용만 있고 git format-patch 로 생성한 파일은 내부를 보면 소스 코드 수정 사항과 함께 commit 까지 포함되어 있다. commit message 까지 같이 전달하고 싶으면 git format-patch 로 patch 파일을 생성하여 전달하면 되고, 소스 코드 수정 사항만 내보내고 싶으면 git diff 로 diff 파일을 만들어 전달하면 된다.&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;staged 에 수정한 사항을 diff 로 저장하고 diff 파일을 적용할 때&lt;/h4&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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;//&amp;nbsp;test.diff&amp;nbsp;에&amp;nbsp;수정&amp;nbsp;사항&amp;nbsp;저장 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;diff&amp;nbsp;&amp;gt;&amp;nbsp;test.diff &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;//&amp;nbsp;test.diff&amp;nbsp;를&amp;nbsp;적용 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;apply&amp;nbsp;test.diff&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;commit 한 사항을 patch 파일로 저장하고 patch 파일을 적용할 때&lt;/h4&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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;//&amp;nbsp;commit&amp;nbsp;2개를&amp;nbsp;patch&amp;nbsp;파일로&amp;nbsp;만들기 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;format-patch&amp;nbsp;-2 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;//&amp;nbsp;test.patch&amp;nbsp;파일을&amp;nbsp;git에&amp;nbsp;적용하기 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;am&amp;nbsp;test.patch&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;모든 수정 사항을 초기화하고 HEAD 로부터 commit N 개 아래 상태로 돌리고 싶을 때&lt;/h4&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;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;git&amp;nbsp;reset&amp;nbsp;--hard&amp;nbsp;HEAD~[N] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;// &amp;lt;예시&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;// 최신 commit 에서부터 2개 이전 commit 으로 돌아가고 싶을 때 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;// git reset --hard HEAD~2&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 팁</category>
      <category>diff</category>
      <category>format-patch</category>
      <category>Git</category>
      <category>git am</category>
      <category>git bash</category>
      <category>git diff</category>
      <category>git 실전</category>
      <category>patch</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/25</guid>
      <comments>https://chardoc.tistory.com/25#entry25comment</comments>
      <pubDate>Wed, 6 Mar 2024 19:27:34 +0900</pubDate>
    </item>
    <item>
      <title>4-Level Page Table</title>
      <link>https://chardoc.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;CPU 32 bit 의 경우 사용 가능한 가상 주소 범위는 이론 상 4 GB&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;=&amp;gt; 2^32 = 4 * 1024 * 1024 * 1024 = 4GB&lt;br /&gt;기본적으로 User 가 3 GB, Kernel 이 1 GB 할당을 받는다. 옵션에 따라 변경은 가능하다. (64 bit 의 경우, 128 테라, 128 테라)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;커널은 1G 를 어떻게 사용하는가?&lt;br /&gt;- 선매핑용 주소 (896G) : 커널 내부에서 사용하는 지역 변수나 동적 할당 변수가 저장됨. DMA 주소 포함&lt;br /&gt;- 후매핑용 주소 (128M) : 나중에 물리 메모리를 연결해서 사용할 용도로 남겨둠. vmalloc, pkmap area 주소, fixmap area 주소&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;CPU 64 bit 의 경우 사용 가능한 가상 주소 범위는 이론 상 16 * 1024 * 1024 TB&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;=&amp;gt; 2^64 = 16 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 = 16 * 1024 * 1024 TB&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;4 Level Page Table&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 주소 9 bit (PGD-Global) + 9 bit (PUD-Upper) + 9 bit (PMD-Middle) + 12 bit (Page Table) = 가상 주소 48 bit 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PGD: Page Global Directory&lt;/li&gt;
&lt;li&gt;PUD: Page Upper Directory&lt;/li&gt;
&lt;li&gt;PMD: Page Middle Directory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfmLBH/btrUdLtOr6J/LxnvDisfPyFOPno8k2MzbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfmLBH/btrUdLtOr6J/LxnvDisfPyFOPno8k2MzbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfmLBH/btrUdLtOr6J/LxnvDisfPyFOPno8k2MzbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfmLBH%2FbtrUdLtOr6J%2FLxnvDisfPyFOPno8k2MzbK%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;1410&quot; height=&quot;462&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;X86_Paging_64bit.svg&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGg4S/btrUab8ifKS/LsLjFIoMMXuk7O7e6scla0/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGg4S/btrUab8ifKS/LsLjFIoMMXuk7O7e6scla0/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGg4S/btrUab8ifKS/LsLjFIoMMXuk7O7e6scla0/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGg4S%2FbtrUab8ifKS%2FLsLjFIoMMXuk7O7e6scla0%2Ftfile.svg&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;701&quot; height=&quot;396&quot; data-filename=&quot;X86_Paging_64bit.svg&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h3 data-ke-size=&quot;size23&quot;&gt;Page Table Entry 가 커버하는 메모리 사이즈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arch/x86/include/asm/page_table.h 파일에서 다음을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1671586499138&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT              12&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 의미는 Page Table Entry 하나가 커버하는 크기는 2^12 = 4 * 1024 = 4KB 인 것을 확인할 수 있다.&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;arch/x86/include/asm/pgtable_64_types.h 에서 다음을 확인 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1671586505035&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * PMD_SHIFT determines the size of the area a middle-level
 * page table can map
 */
#define PMD_SHIFT       21
#define PTRS_PER_PMD    512&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PMD 가 하나 할당 될 경우 PMD_SHIFT 는 9 + 12 bit = 21 bit&lt;br /&gt;따라서 Page Middle Directory 의 하나의 entry 가 커버하는 크기는 2^21 = 2 * 1024 * 1024 = 2 MB 커버 가능&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;부팅 직후 Board 에서 확인할 수 있는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/sys/kernel/debug/page_tables/current_kernel 내용에서 pmd 개수를 알아 낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux</category>
      <category>4 level page table</category>
      <category>Linux</category>
      <category>Memory</category>
      <category>page table</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/23</guid>
      <comments>https://chardoc.tistory.com/23#entry23comment</comments>
      <pubDate>Sun, 18 Dec 2022 20:19:23 +0900</pubDate>
    </item>
    <item>
      <title>MMAP</title>
      <link>https://chardoc.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;mmap 이란 가상 주소 공간(VMA; Virtual Memory Address) 할당 하는 것을 말한다. 파일과 가상 주소를 맵핑할 수도 있다. malloc() 함수도 기본적으로 heap(VMA) 에서 가상 주소 공간을 할당하지만 더 큰 할당이 필요할 때는 내부적으로 mmap 을 통해서 가상 주소 공간을 할당한다.&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;task_struct : Task (혹은 Process) 관리 목적의 커널 자료 구조&lt;br /&gt;ㄴ mm_struct : task_struct 구조체의 하위 자료 구조. 가상 메모리 관리 목적의 커널 자료 구조.&lt;br /&gt;&amp;nbsp; &amp;nbsp; ㄴ vma: 가상 메모리 공간을 관리하는 자료구조 (예시: stack, heap, code .. 등등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Anonymous Page 란? 파일과 매핑이 안된 VMA / Page (예: stack, heap ..)&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;mmap 사용 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;file 을 열어서 읽고 쓰는 것과 비슷하게 다음 과정을 거치면 메모리를 할당 받아 사용할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;open()&lt;/li&gt;
&lt;li&gt;mmap() : malloc 과 거의 동일. 요구한 만큼의 용량 만큼 메모리를 할당하고 할당된 메모리 포인터를 반환.&lt;/li&gt;
&lt;li&gt;memset()&lt;/li&gt;
&lt;li&gt;munmap() : 메모리 할당 해제&lt;/li&gt;
&lt;li&gt;close()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* pagecache 란? 파일과 매핑이 된 Page&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;* 메모리 상에 유지하고 있는 disk cache 버리는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1671359063803&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo 3 &amp;gt; /proc/sys/vm/drop_caches&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proc 의 man 페이지를 통해서 proc 사용 방법을 확인할 수 있다.&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;mmap 과 read 시스템콜 비교&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;read 시스템콜의 경우, read를 할 때마다 시스템콜이 발생하여 user mode -&amp;gt; kernel mode 로 넘어가야 하는 overhead 발생&lt;/li&gt;
&lt;li&gt;mmap 의 경우, 가상 메모리와 물리 메모리가 바로 연결되어 있음. 배열로 된 페이지 테이블을 참고하여 바로 물리 메모리에 접근할 수 있어 속도가 빠름&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;</description>
      <category>Linux</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/22</guid>
      <comments>https://chardoc.tistory.com/22#entry22comment</comments>
      <pubDate>Sun, 18 Dec 2022 15:20:18 +0900</pubDate>
    </item>
    <item>
      <title>Page Fault 관련 정리</title>
      <link>https://chardoc.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&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;&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;Memory 관련 Linux Register&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CR0: Real mode vs Protection mode 구분 가능 (?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CR2: 페이지폴트를 일으킨 가상 주소 저장&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CR3:현재 프로세스의 페이지테이블의 주소 (Vritual Adress - Phsical Address 매핑 테이블)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고할만 한 자료:&amp;nbsp;&lt;a href=&quot;https://blackcon.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blackcon.tistory.com/117&lt;/a&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;Page Fault&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x86 의 경우 Page Fault error code 는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arch/x86/include/asm/traps.h&lt;/p&gt;
&lt;pre id=&quot;code_1671068059055&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * Page fault error code bits:
 *
 *   bit 0 ==    0: no page found   1: protection fault
 *   bit 1 ==    0: read access     1: write access
 *   bit 2 ==    0: kernel-mode access  1: user-mode access
 *   bit 3 ==               1: use of reserved bit detected
 *   bit 4 ==               1: fault was an instruction fetch
 *   bit 5 ==               1: protection keys block access
 */&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arm 의 경우는 다르며 arch/arm64/include/asm/traps.h 에는 없음.&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;h3 data-ke-size=&quot;size23&quot;&gt;Page Fault 발생 시점의 Stack Trace&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqW9na/btrTFbufLTA/okfbaiEZbMfrkqcrsIbvcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqW9na/btrTFbufLTA/okfbaiEZbMfrkqcrsIbvcK/img.png&quot; data-alt=&quot;page fault가 발생한 지점의 stack trace&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqW9na/btrTFbufLTA/okfbaiEZbMfrkqcrsIbvcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqW9na%2FbtrTFbufLTA%2FokfbaiEZbMfrkqcrsIbvcK%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;1532&quot; height=&quot;745&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;page fault가 발생한 지점의 stack trace&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exec 하면서 Page fault 가 날 수도 있고, 여러 경우가 있음&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;Page Fault Handler 주요 흐름&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Page Fault Handling 이라 함은 페이지 변환 테이블을 수정하는 것이다. 다음과 같은 일을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 물리 메모리 (Page Frame) 할당&lt;br /&gt;(2) Virtual Address 와 Physical Adrdress 연결&lt;br /&gt;(3) Page Table 한 요소 (entry) flag 세팅&lt;br /&gt;&amp;nbsp;*PTE: Page Table Entry&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interrupt 나 Exception 이 호출될 때 Entry 에서 시작한다. Page Fault 라는 Exception이 시작하는 부분은 x86 의 경우 arch/x86/entry/entry_64.S 에서 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arch/x86/entry/entry_64.S 의 한 부분이 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1671191601638&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;idtentry page_fault             do_page_fault           has_error_code=1        read_cr2=1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;page_fault 가 호출되면 c로 된 do_page_fault 함수를 호출하고 has_error_code와 read_cr2 (cr2는 fault 가 났을 때 가상 메모리 주소)를 인자로 받아간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mm/fault.c 에서 do_page_fault 함수를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1671192006006&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dotraplinkage void
do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address)
{
        enum ctx_state prev_state;

        prev_state = exception_enter();
        trace_page_fault_entries(regs, error_code, address);
        __do_page_fault(regs, error_code, address);
        exception_exit(prev_state);
}
NOKPROBE_SYMBOL(do_page_fault);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;arm 의 경우에는 entry 가 아닌 다른 진입점이 있을 것으로 예상함. do_page_fault 는 있으나 .S 파일이 없음&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;__do_page_fault 는 &lt;a href=&quot;https://elixir.bootlin.com/linux/v3.19.8/source/arch&quot;&gt;arch&lt;/a&gt;&lt;span style=&quot;background-color: #c0c0c0; color: #888888;&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;https://elixir.bootlin.com/linux/v3.19.8/source/arch/x86&quot;&gt;x86&lt;/a&gt;&lt;span style=&quot;background-color: #c0c0c0; color: #888888;&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;https://elixir.bootlin.com/linux/v3.19.8/source/arch/x86/mm&quot;&gt;mm&lt;/a&gt;&lt;span style=&quot;background-color: #c0c0c0; color: #888888;&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;https://elixir.bootlin.com/linux/v3.19.8/source/arch/x86/mm/fault.c&quot;&gt;fault.c&lt;/a&gt;에서 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1671266997310&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static noinline void
__do_page_fault(struct pt_regs *regs, unsigned long error_code,
		unsigned long address)
{


...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;unlikely 란 if 의 결과 값을 예상하고 미리 분기를 하는 함수. 강의 내용이 커널 3점대 버전으로 진행되는 것 같다. 5점 대 버전에서는 x86 에 상단 내용이 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주된 내용만 살펴보면 page fault 핸들링은 다음과 같이 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #3c78d8;&quot;&gt;do_user_addr_fault() &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;: arch/x86/mm/fault.c&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #3c78d8;&quot;&gt;&amp;nbsp;&amp;nbsp;-&amp;gt; handle_mm_fault() &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;: &amp;nbsp; mm/memory.c&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #3c78d8;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; __handle_mm_fault()&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&amp;nbsp;: &amp;nbsp; mm/memory.c&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #3c78d8;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; handle_pte_fault()&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;: &amp;nbsp; mm/memory.c&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #3c78d8;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; ptep_set_access_flags() &amp;nbsp; :&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;arch/x86/mm/pgtable.c&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #3c78d8;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; set_pte() &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;ldquo;페이지 테이블 한요소(pte) 수정&amp;rdquo;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;task_struct 구조체: task (process) 관리 목적의 커널 자료 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ mm_struct : &lt;span&gt;task_struct 하위 구조체.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;가상 메모리 관리 목적의 커널 자료 구조.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ㄴ vma : mm_struct 의 하위. 가상 메모리 공간을 관리하는 자료 구조. stack 공간, heap 공간, code 공간.&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>Linux</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/20</guid>
      <comments>https://chardoc.tistory.com/20#entry20comment</comments>
      <pubDate>Thu, 15 Dec 2022 10:51:47 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 프로그램과 커널 프로그램</title>
      <link>https://chardoc.tistory.com/19</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;리눅스 프로그램&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c 언어 파일을 컴파일 하면 ELF 파일이 생성&lt;/li&gt;
&lt;li&gt;ELF 란 Excutable and Linkage Format&lt;/li&gt;
&lt;li&gt;바이너리 분석 프로그램
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;readelf&lt;/li&gt;
&lt;li&gt;objdump&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/19</guid>
      <comments>https://chardoc.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 9 Dec 2022 19:00:11 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 운영체제의 구성</title>
      <link>https://chardoc.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;(1) Core&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Process management (PM): task, scheduler, ..&lt;/li&gt;
&lt;li&gt;Memory Management (MM): Virtual Memory, Paging..&lt;/li&gt;
&lt;li&gt;IRQ / Exception 처리, locking
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;entry: 진입점. 프로그램에서 진입점은 main 함수&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;(2) I/O 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 (L4: TCP / L3: IP / L2: Device Driver)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP 통신: Port 번호&lt;/li&gt;
&lt;li&gt;IP: IP 주소&lt;/li&gt;
&lt;li&gt;Device Driver: MAC 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스토리지 (VFS / FS / Block)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Virtual File System (VFS): open/read/write/close 으로 USB/마우스 등 기기 control 가능&lt;/li&gt;
&lt;li&gt;File System (FS)&lt;/li&gt;
&lt;li&gt;Block&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;(3) 기타: security, tools, sounds ...&lt;/p&gt;</description>
      <category>Linux</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/18</guid>
      <comments>https://chardoc.tistory.com/18#entry18comment</comments>
      <pubDate>Fri, 9 Dec 2022 17:25:55 +0900</pubDate>
    </item>
    <item>
      <title>커널 분석 및 디버깅 툴; uftrace</title>
      <link>https://chardoc.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;uftrace&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- User 함수 뿐만 아니라 라이브러리, 커널까지 디버깅할 수 있는 Tracing Tool&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;uftrace record -K 2 [프로그램 명]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;record: 함수 추적하는 옵션&lt;/li&gt;
&lt;li&gt;-K: 커널까지 추적하는 옵션&lt;/li&gt;
&lt;li&gt;2: 함수 depth. 최대 2개까지 호출 되는 것을 볼 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;uftrace replay
&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;record 한 결과를 토대로 함수에 대한 호출 흐름을 보여줌&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux</category>
      <category>debugging</category>
      <category>debugging tool</category>
      <category>Linux</category>
      <category>uftrace</category>
      <category>디버깅</category>
      <category>디버깅툴</category>
      <category>리눅스</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/17</guid>
      <comments>https://chardoc.tistory.com/17#entry17comment</comments>
      <pubDate>Fri, 9 Dec 2022 16:43:53 +0900</pubDate>
    </item>
    <item>
      <title>ALSA DPCM (Advanced Linux Sound Architecture Dynamic PCM) 코드 분석</title>
      <link>https://chardoc.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;include/sound/soc-dpcm.h 참고&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;enum 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snd_soc_dpcm_update : 실행할 runtime_update 값. 업데이트를 안할 것인지, BE 혹인 FE 를 업데이트할 것인지 나타냄&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_UPDATE_NO&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_UPDATE_BE&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_UPDATE_FE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snd_soc_dpcm_link_state : 새로운 링크를 만들 것인지, 만들어진 링크를 분해할 것인지 나타냄&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_LINK_STATE_NEW&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_LINK_STATE_FREE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snd_soc_dpcm_state : PCM 프론트엔트에서 PCM 백엔드의 상태를 나타냄&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_NEW&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_OPEN&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_HW_PARAMS&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_PREPARE&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_START&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_STOP&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_PAUSED&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_SUSPEND&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_HW_FREE&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_STATE_CLOSE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snd_soc_dpcm_trigger : trigger 가 발생했을 때 어떤 trigger 가 발생했는지 나타냄&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_TRIGGER_PRE&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_TRIGGER_HOST&lt;br /&gt;&amp;nbsp;- SND_SOC_DPCM_TRIGGER_BESPOKE&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;Dynamic PCM link 구조체&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조체는 FE DAI 와 BE DAI 를 runtime 에 연결하고, link 상태와 hw_params 정보를 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1647434767299&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct snd_soc_dpcm {
        /* FE and BE DAIs*/
        struct snd_soc_pcm_runtime *be;
        struct snd_soc_pcm_runtime *fe;

        /* link state */
        enum snd_soc_dpcm_link_state state;

        /* list of BE and FE for this DPCM link */
        struct list_head list_be;
        struct list_head list_fe;

        /* hw params for this link - may be different for each link */
        struct snd_pcm_hw_params hw_params;
#ifdef CONFIG_DEBUG_FS
        struct dentry *debugfs_state;
#endif
};&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1647435175077&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct snd_soc_dpcm_runtime {
        struct list_head be_clients;
        struct list_head fe_clients;

        int users;
        struct snd_pcm_runtime *runtime;
        struct snd_pcm_hw_params hw_params;

        /* state and update */
        enum snd_soc_dpcm_update runtime_update;
        enum snd_soc_dpcm_state state;

        int trigger_pending; /* trigger cmd + 1 if pending, 0 if not */
};&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;궁금증 .. dpcm API 들도 snd_soc_pcm_runtime 을 쓰는데, snd_soc_dpcm_runtime 은 언제 쓰이는지...?&amp;nbsp;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;nbsp;-&amp;gt; 쫓아가봤는데 쓰이질 않음..&lt;/i&gt;&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;DPCM APIs&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/*&amp;nbsp;can&amp;nbsp;this&amp;nbsp;BE&amp;nbsp;stop&amp;nbsp;and&amp;nbsp;free&amp;nbsp;*/ &lt;br /&gt;int&amp;nbsp;snd_soc_dpcm_can_be_free_stop(struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*fe, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*be,&amp;nbsp;int&amp;nbsp;stream); &lt;br /&gt;&lt;br /&gt;/*&amp;nbsp;can&amp;nbsp;this&amp;nbsp;BE&amp;nbsp;perform&amp;nbsp;a&amp;nbsp;hw_params()&amp;nbsp;*/ &lt;br /&gt;int&amp;nbsp;snd_soc_dpcm_can_be_params(struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*fe, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*be,&amp;nbsp;int&amp;nbsp;stream); &lt;br /&gt;&lt;br /&gt;/*&amp;nbsp;is&amp;nbsp;the&amp;nbsp;current&amp;nbsp;PCM&amp;nbsp;operation&amp;nbsp;for&amp;nbsp;this&amp;nbsp;FE&amp;nbsp;?&amp;nbsp;*/ &lt;br /&gt;int&amp;nbsp;snd_soc_dpcm_fe_can_update(struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*fe,&amp;nbsp;int&amp;nbsp;stream); &lt;br /&gt;&lt;br /&gt;/*&amp;nbsp;is&amp;nbsp;the&amp;nbsp;current&amp;nbsp;PCM&amp;nbsp;operation&amp;nbsp;for&amp;nbsp;this&amp;nbsp;BE&amp;nbsp;?&amp;nbsp;*/ &lt;br /&gt;int&amp;nbsp;snd_soc_dpcm_be_can_update(struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*fe, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*be,&amp;nbsp;int&amp;nbsp;stream); &lt;br /&gt;&lt;br /&gt;/*&amp;nbsp;get&amp;nbsp;the&amp;nbsp;substream&amp;nbsp;for&amp;nbsp;this&amp;nbsp;BE&amp;nbsp;*/ &lt;br /&gt;struct&amp;nbsp;snd_pcm_substream&amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_soc_dpcm_get_substream(struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*be,&amp;nbsp;int&amp;nbsp;stream); &lt;br /&gt;&lt;br /&gt;/*&amp;nbsp;get&amp;nbsp;the&amp;nbsp;BE&amp;nbsp;runtime&amp;nbsp;state&amp;nbsp;*/ &lt;br /&gt;enum&amp;nbsp;snd_soc_dpcm_state &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_soc_dpcm_be_get_state(struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*be,&amp;nbsp;int&amp;nbsp;stream); &lt;br /&gt;&lt;br /&gt;/*&amp;nbsp;set&amp;nbsp;the&amp;nbsp;BE&amp;nbsp;runtime&amp;nbsp;state&amp;nbsp;*/ &lt;br /&gt;void&amp;nbsp;snd_soc_dpcm_be_set_state(struct&amp;nbsp;snd_soc_pcm_runtime&amp;nbsp;*be,&amp;nbsp;int&amp;nbsp;stream, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enum&amp;nbsp;snd_soc_dpcm_state&amp;nbsp;state);&lt;/p&gt;</description>
      <category>ALSA</category>
      <category>ALSA #DPCM #Dynamic PCM #Audio #Linux #API</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/16</guid>
      <comments>https://chardoc.tistory.com/16#entry16comment</comments>
      <pubDate>Wed, 16 Mar 2022 22:00:10 +0900</pubDate>
    </item>
    <item>
      <title>ALSA DPCM (Advanced Linux Sound Architecture Dynamic PCM) 개념</title>
      <link>https://chardoc.tistory.com/15</link>
      <description>&lt;h1 id=&quot;id-세미나DPCM(DynamicPCM)-ASoCDrivers&quot;&gt;ASoC Drivers&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASoC Machine Driver : Board driver 라고도 불리며, platform 과 DAI, CODEC 을 연결하는 드라이버.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;ASoC Platform Driver : ASoC Platform 드라이버는 DMA 드라이버, SoC DAI 드라이버와 DSP 드라이버로 나뉩니다. Platform 드라이버는 오직 SoC CPU 를 위한 드라이버이며, 특정 보드에 국한되지 않는 드라이버입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASoC DMA Driver&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ASoC DAI Driver : SoC Controller 에서 찾을 수 있는 Digital Audio Interface 드라이버.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ASoC DSP Driver : DSP 드라이버. DPCM 구조 사용.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ASoC CODEC Driver : 코덱 드라이버.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RN4is/btrJBdBFOmK/pD1hVsRGyLujcdoODx3cv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RN4is/btrJBdBFOmK/pD1hVsRGyLujcdoODx3cv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RN4is/btrJBdBFOmK/pD1hVsRGyLujcdoODx3cv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRN4is%2FbtrJBdBFOmK%2FpD1hVsRGyLujcdoODx3cv1%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;441&quot; height=&quot;511&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h1 id=&quot;id-세미나DPCM(DynamicPCM)-DPCManalysisbasedonKernelDocument&quot;&gt;DPCM analysis based on Kernel Document&lt;/h1&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 id=&quot;id-세미나DPCM(DynamicPCM)-Description&quot; data-ke-size=&quot;size26&quot;&gt;Description&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;Dynamic PCM 은 타겟이 부팅된 후에 PCM audio 와 다양한 오디오 디바이스를 라우팅할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, pcm0 는 I2S DAI0, I2S DAI1 에 연결할 수 있습니다.&amp;nbsp;여러 개의 ALSA PCM 을 여러개의 DAI에 연결할 수 있도록 해 SoC DSP 드라이버에 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DPCM 라우팅은 ALSA mixer 설정에 의해 결정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DPCM 은 DSP 내부 audio path 를 나타내는 DAPM 그래프와 믹서 설정을 사용하여 각 ALSA PCM 에 사용되는 패치를 결정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DPCM은 기존의 모든 컴포넌트 코덱, 플랫폼 및 DAI 드라이버를 변경하지 않고 재사용할 수 있습니다.&lt;/span&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;h3 id=&quot;id-세미나DPCM(DynamicPCM)--PhoneAudioSystemwithSoCbasedDSP&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;- Phone Audio System with SoC based DSP&lt;/h3&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 class=&quot;cpp&quot; data-bidi-marker=&quot;true&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;| Front End PCMs    |  SoC DSP  | Back End DAIs | Audio devices |

                    *************
PCM0 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI0-----&amp;gt; Codec Headset
                    *           *
PCM1 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI1-----&amp;gt; Codec Speakers
                    *   DSP     *
PCM2 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI2-----&amp;gt; MODEM
                    *           *
PCM3 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI3-----&amp;gt; BT
                    *           *
                    *           * &amp;lt;----DAI4-----&amp;gt; DMIC
                    *           *
                    *           * &amp;lt;----DAI5-----&amp;gt; FM
                    *************&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;스마트폰은 블루투스, FM 디지털 라디오, 스피커, 헤드셋 잭, 디지털 마이크와 모뎀을 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사운드 카드는 4개의 DSP front end (FE) ALSA PCM 디바이스를 사용할 수 있으며, 6개의 back end (BE) DAI 를 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 FE PCM 은 모든 BE DAI 에 연결할 수 있습니다. FE PCM 디바이스는 1개 이상의 BE DAI 와 연결할 수 있습니다. (최대 BE: 8개)&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;h3 id=&quot;id-세미나DPCM(DynamicPCM)--Example-DPCMSwitchingplaybackfromDAI0toDAI1&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;- Example - DPCM Switching playback from DAI0 to DAI1&lt;/h3&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;PCM0 에서 헤드셋에 오디오가 재생되는 그림은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;clean&quot; data-bidi-marker=&quot;true&quot;&gt;&lt;code&gt;                    *************
PCM0 &amp;lt;============&amp;gt; *           * &amp;lt;====DAI0=====&amp;gt; Codec Headset
                    *           *
PCM1 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI1-----&amp;gt; Codec Speakers
                    *   DSP     *
PCM2 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI2-----&amp;gt; MODEM
                    *           *
PCM3 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI3-----&amp;gt; BT
                    *           *
                    *           * &amp;lt;----DAI4-----&amp;gt; DMIC
                    *           *
                    *           * &amp;lt;----DAI5-----&amp;gt; FM
                    *************&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;clean&quot; data-bidi-marker=&quot;true&quot;&gt;&lt;code&gt;                    *************
PCM0 &amp;lt;============&amp;gt; *           * &amp;lt;----DAI0-----&amp;gt; Codec Headset
                    *           *
PCM1 &amp;lt;------------&amp;gt; *           * &amp;lt;====DAI1=====&amp;gt; Codec Speakers
                    *   DSP     *
PCM2 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI2-----&amp;gt; MODEM
                    *           *
PCM3 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI3-----&amp;gt; BT
                    *           *
                    *           * &amp;lt;----DAI4-----&amp;gt; DMIC
                    *           *
                    *           * &amp;lt;----DAI5-----&amp;gt; FM
                    *************&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;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Machine Driver 가 헤드셋 잭이 제거되는 이벤트를 받음&lt;/li&gt;
&lt;li&gt;Machine Driver 혹은 Audio HAL 이 헤드셋 path 를 disable&lt;/li&gt;
&lt;li&gt;disable 이 된 후에 DPCM 은 헤드셋과 연결된 DAI0 를 PCM stop trigger 와 hw_free(), shutdown() 오퍼레이션 수행&lt;/li&gt;
&lt;li&gt;Machine Driver 혹은 Audio HAL 은 스피커 path 를 enable&lt;/li&gt;
&lt;li&gt;DPCM 은 스피커 path 가 enable 된 후에 스피커와 연결된 DAI1 을 startup(), hw_params(), prepare() 를 수행하고 start trigger 발생 시킴&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;이 예시에서는 Machine Driver 혹은 Audio HAL 이 라우팅을 바꿀 수 있고, DPCM 은 link up / down 하기 위해 DAI PCM 오퍼레이션을 관리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오디오 재생은 이렇게 link 가 변하는 동안에도 멈추지 않습니다.&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 id=&quot;id-세미나DPCM(DynamicPCM)-DPCMMachineDriver&quot; data-ke-size=&quot;size26&quot;&gt;DPCM Machine Driver&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;이번 목차에서는 DPCM 의 Machine Driver 에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DPCM 의 Machine Driver 는 다음 3가지를 제외하고는 기존 드라이버와 유사합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FE, BE DAI link 를 정의&lt;/li&gt;
&lt;li&gt;FE, BE PCM operation 을 정의&lt;/li&gt;
&lt;li&gt;Widget Graph Connection 을 정의&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;id-세미나DPCM(DynamicPCM)--FEandBEDAIlinks&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;- FE and BE DAI links&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 그림을 예시로 FE DAI link 와 BE DAI link를 설정하는 방법을 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;clean&quot; data-bidi-marker=&quot;true&quot;&gt;&lt;code&gt;| Front End PCMs    |  SoC DSP  | Back End DAIs | Audio devices |

                    *************
PCM0 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI0-----&amp;gt; Codec Headset
                    *           *
PCM1 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI1-----&amp;gt; Codec Speakers
                    *   DSP     *
PCM2 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI2-----&amp;gt; MODEM
                    *           *
PCM3 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI3-----&amp;gt; BT
                    *           *
                    *           * &amp;lt;----DAI4-----&amp;gt; DMIC
                    *           *
                    *           * &amp;lt;----DAI5-----&amp;gt; FM
                    *************&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;위 그림은 총 4개의 FE DAI link 와 6개의 BE DAI link 가 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 FE DAI link 를 선언합니다.&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;FE DAI link 예시&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Machine Driver&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_818472&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;div&gt;9&lt;/div&gt;
&lt;div&gt;10&lt;/div&gt;
&lt;div&gt;11&lt;/div&gt;
&lt;div&gt;12&lt;/div&gt;
&lt;div&gt;13&lt;/div&gt;
&lt;div&gt;14&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;static&lt;span&gt;&amp;nbsp;&lt;/span&gt;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_soc_dai_link machine_dais[] = {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;PCM0 System&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.stream_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;System Playback&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.cpu_dai_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;System Pin&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.platform_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;dsp-audio&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.codec_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;snd-soc-dummy&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.codec_dai_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;snd-soc-dummy-dai&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.dynamic = 1,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.dpcm_playback = 1,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.....&amp;lt; other FE and BE DAI links here &amp;gt;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #404040;&quot;&gt;dynamic&lt;/span&gt;&lt;span style=&quot;color: #404040;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #404040;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #404040;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #404040;&quot;&gt;1&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #404040;&quot;&gt;Dynamic PCM 이라는 뜻&lt;/span&gt;&lt;span style=&quot;color: #404040;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #404040;&quot;&gt;dpcm_playback = 1&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #404040;&quot;&gt;PCM 을 Playback 으로 사용할 때 선언.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #404040;&quot;&gt;dpcm_capture 와 함께 선언 가능.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #404040;&quot;&gt;dpcm_capture = 1&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #404040;&quot;&gt;PCM 을 Capture 로 사용할 때 선언.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #404040;&quot;&gt;dpcm_playback&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #404040;&quot;&gt;와 함께 선언 가능.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;.codec_name = &quot;snd-soc-dummy&quot;,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BE 가 dynamic 하게 routing 에 따라 바뀌므로 dummy 로 선언&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;.codec_dai_name = &quot;snd-soc-dummy-dai&quot;,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BE 가 dynamic 하게 routing 에 따라 바뀌므로 dummy 로 선언&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 component 보다 앞에 혹은 뒤에 trigger 될 것인지 선언&lt;/li&gt;
&lt;li&gt;첫번째 인자는 Playback, 두번째 인자는 Capture&lt;/li&gt;
&lt;li&gt;종류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SND_SOC_DPCM_TRIGGER_PRE : FE 가 먼저 trigger&lt;/li&gt;
&lt;li&gt;SND_SOC_DPCM_TRIGGER_POST :&amp;nbsp; BE 가 먼저 trigger&lt;/li&gt;
&lt;li&gt;SND_SOC_DPCM_TRIGGER_BESPOKE : FE 와 BE 동시에 trigger (dai 쪽에 bespoke_trigger 가 구현이 되어야 함)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;b&gt;sound/soc/soc-pcm.c&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_599673&quot;&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;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2774&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;if&lt;span&gt;&amp;nbsp;&lt;/span&gt;(rtd-&amp;gt;dai_link-&amp;gt;dynamic) {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2775&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.open&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_open;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2776&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.hw_params&amp;nbsp; = dpcm_fe_dai_hw_params;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2777&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.prepare&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_prepare;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2778&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.trigger&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_trigger;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2779&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.hw_free&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_hw_free;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2780&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.close&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_close;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2781&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.pointer&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_pointer;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2782&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.ioctl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_ioctl;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2783&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span&gt;&amp;nbsp;&lt;/span&gt;else&lt;span&gt;&amp;nbsp;&lt;/span&gt;{&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2784&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.open&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_open;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2785&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.hw_params&amp;nbsp; = soc_pcm_hw_params;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2786&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.prepare&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_prepare;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2787&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.trigger&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_trigger;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2788&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.hw_free&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_hw_free;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2789&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.close&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_close;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2790&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.pointer&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_pointer;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2791&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.ioctl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_ioctl;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2792&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;b&gt;sound/soc/soc-pcm.c&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_599673&quot;&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;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2774&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;if&lt;span&gt;&amp;nbsp;&lt;/span&gt;(rtd-&amp;gt;dai_link-&amp;gt;dynamic) {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2775&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.open&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_open;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2776&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.hw_params&amp;nbsp; = dpcm_fe_dai_hw_params;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2777&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.prepare&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_prepare;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2778&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.trigger&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_trigger;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2779&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.hw_free&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_hw_free;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2780&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.close&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = dpcm_fe_dai_close;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2781&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.pointer&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_pointer;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2782&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.ioctl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_ioctl;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2783&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span&gt;&amp;nbsp;&lt;/span&gt;else&lt;span&gt;&amp;nbsp;&lt;/span&gt;{&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2784&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.open&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_open;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2785&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.hw_params&amp;nbsp; = soc_pcm_hw_params;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2786&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.prepare&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_prepare;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2787&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.trigger&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_trigger;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2788&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.hw_free&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_hw_free;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2789&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.close&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_close;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2790&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.pointer&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_pointer;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2791&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtd-&amp;gt;ops.ioctl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = soc_pcm_ioctl;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;2792&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;BE DAI link 예시&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Machine Driver&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_191560&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;div&gt;9&lt;/div&gt;
&lt;div&gt;10&lt;/div&gt;
&lt;div&gt;11&lt;/div&gt;
&lt;div&gt;12&lt;/div&gt;
&lt;div&gt;13&lt;/div&gt;
&lt;div&gt;14&lt;/div&gt;
&lt;div&gt;15&lt;/div&gt;
&lt;div&gt;16&lt;/div&gt;
&lt;div&gt;17&lt;/div&gt;
&lt;div&gt;18&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;static&lt;span&gt;&amp;nbsp;&lt;/span&gt;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_soc_dai_link machine_dais[] = {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.....&amp;lt; FE DAI links here &amp;gt;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;Codec Headset&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.cpu_dai_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;ssp-dai.0&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.platform_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;snd-soc-dummy&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.no_pcm = 1,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.codec_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;rt5640.0-001c&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.codec_dai_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;rt5640-aif1&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ignore_suspend = 1,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ignore_pmdown_time = 1,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.be_hw_params_fixup = hswult_ssp0_fixup,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ops = &amp;amp;haswell_ops,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.dpcm_playback = 1,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.dpcm_capture = 1,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.....&amp;lt; other BE DAI links here &amp;gt;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.platform_name = &quot;snd-soc-dummy&quot;,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FE DAI Link 가 routing에 따라 바뀌므로 dummy 로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;.no_pcm = 1,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BE DAI link 라는 것을 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;.ignore_suspend = 1,&lt;br /&gt;.ignore_pmdown_time = 1,&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hostless 모드에서 사용 (ex. BT Call)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;.dpcm_playback = 1,&lt;br /&gt;.dpcm_capture = 1,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;playback 으로 사용할 것인지, capture 로 사용할 것인지 표시&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;cf) hostless 모드란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.ignore_suspend = 1,&lt;br /&gt;.ignore_pmdown_time = 1,&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;BT Call 과 같이 Host CPU 가 데이터를 전송하지 않는 모드&lt;/p&gt;
&lt;pre class=&quot;clean&quot; data-bidi-marker=&quot;true&quot;&gt;&lt;code&gt;                    *************
PCM0 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI0-----&amp;gt; Codec Headset
                    *           *
PCM1 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI1-----&amp;gt; Codec Speakers
                    *   DSP     *
PCM2 &amp;lt;------------&amp;gt; *           * &amp;lt;====DAI2=====&amp;gt; MODEM
                    *           *
PCM3 &amp;lt;------------&amp;gt; *           * &amp;lt;====DAI3=====&amp;gt; BT
                    *           *
                    *           * &amp;lt;----DAI4-----&amp;gt; DMIC
                    *           *
                    *           * &amp;lt;----DAI5-----&amp;gt; FM
                    *************&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;이 모드는 BT 와 MODEM 이 동작 중이더라도 host CPU 는 sleep 할 수 있다.&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;h3 id=&quot;id-세미나DPCM(DynamicPCM)--FE/BEPCMOperations&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;- FE / BE PCM Operations&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BE dai link 에서는 fixup callback 이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fixup callback 은 machine driver 에서 FE hw params 에 따라 DAI 구성을 설정하는 데에 사용됩니다. 즉, DSP 는 SRC 나 ASRC 를 FE 나 BE 에서 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, DSP 가 모든 FE hw params 를 DAI0, 48K, 16 bit, stereo channel 로 바꾼다고 하면, 모든 FE hw params 가 DAI0 로 고정되어야 하며, DAI 는 현재 FE 구성이 어떻든 요구된 사항으로 운영되어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fixup callback 이 호출되는 시점은&amp;nbsp;dpcm_fe_dai_hw_params 내부에서, FE hw_params 와 BE hw_params 가 호출되기 이전에 호출됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Machine Driver&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_413411&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;div&gt;9&lt;/div&gt;
&lt;div&gt;10&lt;/div&gt;
&lt;div&gt;11&lt;/div&gt;
&lt;div&gt;12&lt;/div&gt;
&lt;div&gt;13&lt;/div&gt;
&lt;div&gt;14&lt;/div&gt;
&lt;div&gt;15&lt;/div&gt;
&lt;div&gt;16&lt;/div&gt;
&lt;div&gt;17&lt;/div&gt;
&lt;div&gt;18&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;static&lt;span&gt;&amp;nbsp;&lt;/span&gt;int&lt;span&gt;&amp;nbsp;&lt;/span&gt;dai0_fixup(struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_soc_pcm_runtime *rtd,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_pcm_hw_params *params)&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;{&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_interval *rate = hw_param_interval(params,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SNDRV_PCM_HW_PARAM_RATE);&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_interval *channels = hw_param_interval(params,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SNDRV_PCM_HW_PARAM_CHANNELS);&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* The DSP will covert the FE rate to 48k, stereo */&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rate-&amp;gt;min = rate-&amp;gt;max = 48000;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;channels-&amp;gt;min = channels-&amp;gt;max = 2;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* set DAI0 to 16 bit */&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_mask_set(&amp;amp;params-&amp;gt;masks[SNDRV_PCM_HW_PARAM_FORMAT -&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SNDRV_PCM_HW_PARAM_FIRST_MASK],&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SNDRV_PCM_FORMAT_S16_LE);&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;span&gt;&amp;nbsp;&lt;/span&gt;0;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 PCM operation 들은 표준 DAI link 에서 사용하는 PCM Operation 과 동일합니다.&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;h3 id=&quot;id-세미나DPCM(DynamicPCM)--Widgetgraphconnections&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;- Widget graph connections&lt;/h3&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;h4 id=&quot;id-세미나DPCM(DynamicPCM)-Widget&quot; data-ke-size=&quot;size20&quot;&gt;Widget&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Desciption&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Widget 은 DAPM 커널 문서에서 참고할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAPM 에서의 Widget 은 전력에 영향을 주는 모든 component 를 말합니다. (ex, CODEC, Audio Interface, SRC 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAPM 에는 4개의 Domain 이 있고 이에 따라 4 종류의 Widget 이 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CODEC Bias domain&lt;/li&gt;
&lt;li&gt;Platform / Machine domain&lt;/li&gt;
&lt;li&gt;Path domain : mixer 와 mux 세팅이 유저에 의해 바뀔 때 자동으로 세팅되게 해주는 Widget. alsamixer 나 amixer 에 사용.&lt;/li&gt;
&lt;li&gt;Stream domain :&amp;nbsp; 스트림 재생 / 녹음이 시작되고 멈추는 것을 enable / disable 할 수 있는 Widget&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;expander-857346127&quot; data-hasbody=&quot;true&quot; data-macro-name=&quot;expand&quot;&gt;
&lt;div id=&quot;expander-control-857346127&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0052cc;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAPM 매크로를 이용한 Widget 선언 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드라이버 소스 코드에서 다음과 같이 DAPM 에서 제공하는 매크로를 이용하여 Widget 을 등록할 수 있습니다.&lt;/p&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;Stream Domain Widget 예시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Widget 등록 매크로 예시&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_18043&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;/* Stream Domain Widget Define */&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;#define SND_SOC_DAPM_AIF_IN(wname, stname, wslot, wreg, wshift, winvert)&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;#define SND_SOC_DAPM_AIF_OUT(wname, stname, wslot, wreg, wshift, winvert)&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;/* Stream Domain Widget Example */&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;SND_SOC_DAPM_AIF_IN(&quot;DAI0 RX&quot;, NULL, 0, SND_SOC_NOPM, 0, 0),&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;SND_SOC_DAPM_AIF_OUT(&quot;DAI0 TX&quot;, NULL, 0, SND_SOC_NOPM, 0, 0),&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Path Domain Widget 예시&lt;br /&gt;3가지 input 중에 wm8731 output 으로 어떤 widget 을 선택할건지 MIXER 를 등록하는 예시를 들겠습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Line Bypass Input&lt;/li&gt;
&lt;li&gt;DAC (HiFi Playback)&lt;/li&gt;
&lt;li&gt;Mic Sidetone Input&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;include/sound/soc-dapm.h&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_668202&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;#define SOC_DAPM_SINGLE(xname, reg, shift, max, invert)&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;#define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, wcontrols, wncontrols)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Machine Driver&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_770435&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;/* Output Mixer */&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;static&lt;span&gt;&amp;nbsp;&lt;/span&gt;const&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_kcontrol_new_t wm8731_output_mixer_controls[] = {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;SOC_DAPM_SINGLE(&quot;Line Bypass Switch&quot;, WM8731_APANA, 3, 1, 0),&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;SOC_DAPM_SINGLE(&quot;Mic Sidetone Switch&quot;, WM8731_APANA, 5, 1, 0),&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;SOC_DAPM_SINGLE(&quot;HiFi Playback Switch&quot;, WM8731_APANA, 4, 1, 0),&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;SND_SOC_DAPM_MIXER(&quot;Output Mixer&quot;, WM8731_PWR, 4, 1, wm8731_output_mixer_controls, ARRAY_SIZE(wm8731_output_mixer_controls)),&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;- Device Tree 를 이용한 DAPM Widget 선언 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디바이스 트리를 사용한 예시입니다.&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Device Tree&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_896366&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;div&gt;9&lt;/div&gt;
&lt;div&gt;10&lt;/div&gt;
&lt;div&gt;11&lt;/div&gt;
&lt;div&gt;12&lt;/div&gt;
&lt;div&gt;13&lt;/div&gt;
&lt;div&gt;14&lt;/div&gt;
&lt;div&gt;15&lt;/div&gt;
&lt;div&gt;16&lt;/div&gt;
&lt;div&gt;17&lt;/div&gt;
&lt;div&gt;18&lt;/div&gt;
&lt;div&gt;19&lt;/div&gt;
&lt;div&gt;20&lt;/div&gt;
&lt;div&gt;21&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;sound {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compatible =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;simple-audio-card&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;VF610-Tower-Sound-Card&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,format =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;left_j&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,bitclock-master = &amp;lt;&amp;amp;dailink0_master&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,frame-master = &amp;lt;&amp;amp;dailink0_master&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,widgets =&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Microphone&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;Microphone Jack&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Headphone&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;Headphone Jack&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Speaker&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;External Speaker&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,cpu {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sound-dai = &amp;lt;&amp;amp;sh_fsi2 0&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dailink0_master: simple-audio-card,codec {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sound-dai = &amp;lt;&amp;amp;ak4648&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clocks = &amp;lt;&amp;amp;osc&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAPM Widget 은 string 이 한 짝을 이뤄 동작합니다. (Document/devictree/bindings/widgets.txt 참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &quot;template-wname&quot;, &quot;user-supplied-wname&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;p data-ke-size=&quot;size16&quot;&gt;첫번째 요소는 template widget name 을 나타내고, 두번째 요소는 user 가 정하는 widget name 입니다.&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;- Widget 이 실제 등록되는 장소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Widget은 snd_soc_card 구조체에 linked list 형태로 등록되어 연결이 되어 있고, Component 드라이버에서도 Widget list를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snd_soc_card 구조체에 선언된 Widget 들과 snd_soc_component_driver 에 등록된 Widget 은 동일하며, card 를 등록할 때 component 에 있는 Widget 들을 가져다 card 에 저장합니다.&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;h4 id=&quot;id-세미나DPCM(DynamicPCM)-Routing&quot; data-ke-size=&quot;size20&quot;&gt;Routing&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAPM 은 초기화 타이밍에 오디오 라우팅 맵을 참조하여 BE DAI link 를 연결합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eosqOz/btrJBJUKu3x/h2pks9hTRcEFVhMfHKv3lk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eosqOz/btrJBJUKu3x/h2pks9hTRcEFVhMfHKv3lk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eosqOz/btrJBJUKu3x/h2pks9hTRcEFVhMfHKv3lk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeosqOz%2FbtrJBJUKu3x%2Fh2pks9hTRcEFVhMfHKv3lk%2Fimg.jpg&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;1440&quot; height=&quot;150&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&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;u&gt;만일 BE CODEC 이나 BE DAI 가 dummy 일 경우,&lt;/u&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;반드시 아래가 드라이버가 반드시 선언이 되어야 합니다.&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Machine Driver&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_891129&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;/* BE for codec Headset -&amp;nbsp; DAI0 is dummy and managed by DSP FW */&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;static&lt;span&gt;&amp;nbsp;&lt;/span&gt;const&lt;span&gt;&amp;nbsp;&lt;/span&gt;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_soc_dapm_route audio_map[] = {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;DAI0 CODEC IN&quot;, NULL,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;AIF1 Capture&quot;},&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;AIF1 Playback&quot;, NULL,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;DAI0 CODEC OUT&quot;},&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 요소는 sink, 두번째 요소는 control, 세번째 요소는 source 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;include/sound/soc-dapm.h&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_113496&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;div&gt;9&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_soc_dapm_route {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&lt;span&gt;&amp;nbsp;&lt;/span&gt;char&lt;span&gt;&amp;nbsp;&lt;/span&gt;*sink;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&lt;span&gt;&amp;nbsp;&lt;/span&gt;char&lt;span&gt;&amp;nbsp;&lt;/span&gt;*control;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&lt;span&gt;&amp;nbsp;&lt;/span&gt;char&lt;span&gt;&amp;nbsp;&lt;/span&gt;*source;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Note: currently only supported for links where source is a supply */&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&lt;span&gt;&amp;nbsp;&lt;/span&gt;(*connected)(struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_soc_dapm_widget *source,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;snd_soc_dapm_widget *sink);&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;다음과 같이 디바이스 트리에서 routing 을 선언할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routing 은 string 을 한 쌍으로 선언해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 요소는 sink, 두번째 요소는 source 를 의미합니다.&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Device Tree&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_879205&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;div&gt;9&lt;/div&gt;
&lt;div&gt;10&lt;/div&gt;
&lt;div&gt;11&lt;/div&gt;
&lt;div&gt;12&lt;/div&gt;
&lt;div&gt;13&lt;/div&gt;
&lt;div&gt;14&lt;/div&gt;
&lt;div&gt;15&lt;/div&gt;
&lt;div&gt;16&lt;/div&gt;
&lt;div&gt;17&lt;/div&gt;
&lt;div&gt;18&lt;/div&gt;
&lt;div&gt;19&lt;/div&gt;
&lt;div&gt;20&lt;/div&gt;
&lt;div&gt;21&lt;/div&gt;
&lt;div&gt;22&lt;/div&gt;
&lt;div&gt;23&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;sound {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compatible =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;simple-scu-audio-card&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;rsnd-ak4643&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,format =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;left_j&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,bitclock-master = &amp;lt;&amp;amp;sndcodec&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,frame-master = &amp;lt;&amp;amp;sndcodec&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,convert-rate = &amp;lt;48000&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,prefix =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;ak4642&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,routing =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;ak4642 Playback&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;DAI0 Playback&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;DAI0 Capture&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;ak4642 Capture&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sndcpu: simple-audio-card,cpu {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sound-dai = &amp;lt;&amp;amp;rcar_sound&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sndcodec: simple-audio-card,codec {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sound-dai = &amp;lt;&amp;amp;ak4643&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system-clock-frequency = &amp;lt;11289600&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시는 DAI0 Playback 에서 ak4642 로 음원을 재생하고, ak4642 에서 DAI0 로 음원을 녹음하는 예시를 나타냅니다.&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;하나의 Mixer 에 Line Input, DAC, MIC 와 같이 3 가지 input 이 들어갈 때의 디바이스 트리 예시입니다.&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Device Tree&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_697146&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;div&gt;9&lt;/div&gt;
&lt;div&gt;10&lt;/div&gt;
&lt;div&gt;11&lt;/div&gt;
&lt;div&gt;12&lt;/div&gt;
&lt;div&gt;13&lt;/div&gt;
&lt;div&gt;14&lt;/div&gt;
&lt;div&gt;15&lt;/div&gt;
&lt;div&gt;16&lt;/div&gt;
&lt;div&gt;17&lt;/div&gt;
&lt;div&gt;18&lt;/div&gt;
&lt;div&gt;19&lt;/div&gt;
&lt;div&gt;20&lt;/div&gt;
&lt;div&gt;21&lt;/div&gt;
&lt;div&gt;22&lt;/div&gt;
&lt;div&gt;23&lt;/div&gt;
&lt;div&gt;24&lt;/div&gt;
&lt;div&gt;25&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;sound {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compatible =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;simple-scu-audio-card&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;rsnd-ak4643&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,format =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;left_j&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,bitclock-master = &amp;lt;&amp;amp;sndcodec&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,frame-master = &amp;lt;&amp;amp;sndcodec&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,convert-rate = &amp;lt;48000&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,prefix =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;ak4642&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple-audio-card,routing =&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Output Mixer&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;Line Input&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Output Mixer&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;DAC&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;Output Mixer&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;Mic Bias&quot;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sndcpu: simple-audio-card,cpu {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sound-dai = &amp;lt;&amp;amp;rcar_sound&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sndcodec: simple-audio-card,codec {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sound-dai = &amp;lt;&amp;amp;ak4643&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system-clock-frequency = &amp;lt;11289600&amp;gt;;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASRC 의 경우 디바이스 트리나 소스 코드에 widget 을 사용하지 않고 probe 시에 snd_soc_dapm_route 에 source 와 sink 를 직접 넣어줍니다.&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;h2 id=&quot;id-세미나DPCM(DynamicPCM)-WritingaDPCMDSPdriver&quot; data-ke-size=&quot;size26&quot;&gt;Writing a DPCM DSP driver&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;DPCM DSP 드라이버는 코덱 클래스 드라이버로부터 요소들이 결합된 표준 플랫폼 클래스 ASoC 드라이버와 매우 비슷합니다. DSP driver는 다음이 구현되어야 합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FE PCM DAIs - i.e. struct snd_soc_dai_driver&lt;/li&gt;
&lt;li&gt;DAPM widgets&lt;/li&gt;
&lt;li&gt;DAPM graph showing DSP audio routing from FE DAIs to BEs&lt;/li&gt;
&lt;li&gt;Mixers for gains, routing, etc.&lt;/li&gt;
&lt;li&gt;DMA configuration&lt;/li&gt;
&lt;li&gt;BE AIF widgets.&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;6번 아이템은 DSP 외부의 오디오와 라우팅 하는데에 중요합니다. AIF 는 각 BE 와 각 스트림 방향이 정의되어야 합니다. 즉, BE DAI0 는 다음과 같아야 합니다.&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;Machine Driver&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_773749&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;SND_SOC_DAPM_AIF_IN(&quot;DAI0 RX&quot;, NULL, 0, SND_SOC_NOPM, 0, 0),&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;SND_SOC_DAPM_AIF_OUT(&quot;DAI0 TX&quot;, NULL, 0, SND_SOC_NOPM, 0, 0),&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BE AIF 는 DSP 그래프와 다른 컴포넌트 드라이버 (ex. codec graph) 와 연결되는데 사용됩니다.&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 id=&quot;id-세미나DPCM(DynamicPCM)-HostlessPCMstreams&quot; data-ke-size=&quot;size26&quot;&gt;Hostless PCM streams&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;Hostless CPU 는 host CPU 에서 스트림이 라우팅되지 않는 것을 말합니다. 아래는 헤드셋으로 통화할 때 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;clean&quot; data-bidi-marker=&quot;true&quot;&gt;&lt;code&gt;                    *************
PCM0 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI0-----&amp;gt; Codec Headset
                    *           *
PCM1 &amp;lt;------------&amp;gt; *           * &amp;lt;====DAI1=====&amp;gt; Codec Speakers/Mic
                    *   DSP     *
PCM2 &amp;lt;------------&amp;gt; *           * &amp;lt;====DAI2=====&amp;gt; MODEM
                    *           *
PCM3 &amp;lt;------------&amp;gt; *           * &amp;lt;----DAI3-----&amp;gt; BT
                    *           *
                    *           * &amp;lt;----DAI4-----&amp;gt; DMIC
                    *           *
                    *           * &amp;lt;----DAI5-----&amp;gt; FM
                    *************&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;이 케이스에서는 PCM 데이터가 DSP 를 통해 라우팅 되고, host CPU 는 컨트롤하는데에만 사용되고 런타임에는 sleep 할 수 있습니다.&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;Hostless link 를 제어하는 방법은 2가지가 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;링크를 CODEC &amp;harr; CODEC 스타일로 구성하는 방법.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 경우에는 DAPM graph 로 상태를 enable / disable 할 수 있습니다.&lt;br /&gt;즉, mixer control 를 통해서 연결 / 연결 해제를 지원해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DAPM 그래프 상 FE 와 BE 사이에 가상 연결을 하는 방법.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FE 에 mixer control 를 등록합니다.&lt;br /&gt;이 방법은 DAI link 간 더 많은 control 할 수 있게 해주지만, user space 에서 링크를 제어하기 위해 더 많은 코드가 필요합니다.&lt;br /&gt;만일 HW 가 PCM operation 간의 fine grained 가 필요할 경우가 아니면 CODEC &amp;harr; CODEC 을 추천합니다.&lt;/li&gt;
&lt;/ul&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;h3 id=&quot;id-세미나DPCM(DynamicPCM)-CODEC&amp;harr;CODEClink&quot; data-ke-size=&quot;size23&quot;&gt;CODEC &amp;harr; CODEC link&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAPM 그래프 내에서 path 를 enable 할 때 DAI link 가 enable 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;machine 드라이버는 DAI link 에 추가적은 parameter 를 세팅합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-hasbody=&quot;true&quot; data-macro-name=&quot;code&quot;&gt;
&lt;div&gt;&lt;b&gt;CODEC &amp;harr; CODEC link&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_669723&quot;&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;td&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;div&gt;6&lt;/div&gt;
&lt;div&gt;7&lt;/div&gt;
&lt;div&gt;8&lt;/div&gt;
&lt;div&gt;9&lt;/div&gt;
&lt;div&gt;10&lt;/div&gt;
&lt;div&gt;11&lt;/div&gt;
&lt;div&gt;12&lt;/div&gt;
&lt;div&gt;13&lt;/div&gt;
&lt;div&gt;14&lt;/div&gt;
&lt;div&gt;15&lt;/div&gt;
&lt;div&gt;16&lt;/div&gt;
&lt;div&gt;17&lt;/div&gt;
&lt;div&gt;18&lt;/div&gt;
&lt;div&gt;19&lt;/div&gt;
&lt;div&gt;20&lt;/div&gt;
&lt;div&gt;21&lt;/div&gt;
&lt;div&gt;22&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;static const struct snd_soc_pcm_stream dai_params = {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;.formats = SNDRV_PCM_FMTBIT_S32_LE,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;.rate_min = 8000,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;.rate_max = 8000,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;.channels_min = 2,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;.channels_max = 2,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;};&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;static struct snd_soc_dai_link dais[] = {&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;lt; ...&lt;span&gt;&amp;nbsp;&lt;/span&gt;more&lt;span&gt;&amp;nbsp;&lt;/span&gt;DAI links above ... &amp;gt;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;MODEM&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.stream_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;MODEM&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.cpu_dai_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;dai2&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.codec_dai_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;modem-aif1&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.codec_name =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;modem&quot;,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| SND_SOC_DAIFMT_CBM_CFM,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.params = &amp;amp;dai_params,&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;lt; ...&lt;span&gt;&amp;nbsp;&lt;/span&gt;more&lt;span&gt;&amp;nbsp;&lt;/span&gt;DAI links here ... &amp;gt;&lt;/div&gt;
&lt;div data-bidi-marker=&quot;true&quot;&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시의 dai_params 는 DAPM 이 유효한 path 을 감지할 때 DAI 의 hw_parms() 오퍼레이션에서 사용됩니다. 그리고 link 를 start operation 을 호출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 후에 DAPM 은 Path 가 유효하지 않아 졌을 때, 적절한 PCM operation 을 찾아서 DAI 를 disable 합니다.&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;h3 id=&quot;id-세미나DPCM(DynamicPCM)-HostlessFE&quot; data-ke-size=&quot;size23&quot;&gt;Hostless FE&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PCM data 를 아예 읽거나 쓰지 않는 DAI link 의 경우 FE 에 의해 enable 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개의 DAI link 에 연결되는 가상의 path 와 연결되는 새로운 FE 를 만드는 것을 뜻합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAI link 들은 FE PCM 이 시작할 때 시작 해야 하고, FE PCM 이 멈출 때 멈추어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, FE PCM 은 이 구성에서는 read / write 를 할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ALSA</category>
      <category>ALSA #DPCM #Dynamic PCM #DSP #CODEC</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/15</guid>
      <comments>https://chardoc.tistory.com/15#entry15comment</comments>
      <pubDate>Wed, 16 Mar 2022 21:31:50 +0900</pubDate>
    </item>
    <item>
      <title>[USB] 호스트가 디바이스 정보 얻기</title>
      <link>https://chardoc.tistory.com/14</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4장&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이벤트와 리퀘스트&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;허브는 주기적으로 하향 포트에 연결된 디바이스의 장착과 탈착을 감지. 주기적으로 폴링을 하거나 인핸스드 슈퍼스피드 패킷을 수신하여 디바이스의 장/탈착을 감지한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;과정&lt;br /&gt;&amp;nbsp;1. 호스트는 새 디바이스에 대한 정보를 얻기 위해 디바이스 허브로 리퀘스트&lt;br /&gt;&amp;nbsp;2. 허브는 디바이스와 호스트 간에 통신 경로를 설정&lt;br /&gt;&amp;nbsp;3. 호스트는 통신 경로에 제어 전송(&lt;span style=&quot;color: #333333;&quot;&gt;표준 USB 리퀘스트 포함)&lt;/span&gt;을 보내어 디바이스 열거 시도&lt;br /&gt;&amp;nbsp;4. 디바이스는 각 리퀘스트에 해당하는 정보로 응답하거나 요청된 기타 동작 수행&lt;br /&gt;* 모든 USB 디바이스는 제어 전송, 표준 리퀘스트, 엔드포인트 0을 지원해야 함&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 상태 얻기&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;디바이스의 상태 (USB 2.0 기준)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전원 공급됨 (Powered)&lt;/li&gt;
&lt;li&gt;기본 (Default)&lt;/li&gt;
&lt;li&gt;주소 (Address)&lt;/li&gt;
&lt;li&gt;설정됨 (Configured)&lt;/li&gt;
&lt;li&gt;장착됨 (Attached)&lt;br /&gt;: 허브가 디바이스의 VBUS 선에 전원을 공급하지 않은 상태. VBUS에 전원이 없으면 호스트와 디바이스가 통신을 할 수 없기 때문에 디바이스가 연결되지 않은 것과 마찬가지.&lt;/li&gt;
&lt;li&gt;서스펜드 (Suspend)&lt;br /&gt;: 최소 3ms 동안 SOF 마커를 포함한 버스 활동이 없는 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;일반적인 USB 2.0 순서&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;시스템이 새 디바이스를 갖는다.&lt;br /&gt;: 사용자가 USB 포트에 디바이스를 장착하거나 디바이스를 장착한 상태에서 시스템 전원을 넣음.&lt;br /&gt;&amp;nbsp;허브가 포트에 전원을 공급하면 디바이스는 Powerd 상태가 됨 (디바이스는 버르소부터 100mA까지 전류를 얻을 수 있음)&lt;/li&gt;
&lt;li&gt;허브가 디바이스를 감지한다.&lt;br /&gt;: 허브는 각 포트의 신호선(D+와 D-) 전압을 감시한다. 허브의 각 신호선은 14.25~24.8k&amp;Omega;의 풀다운 저항이 있다. 디바이스는 풀스프드 디바이스에서는 D+에, 로우스피드 디바이스에서는 D-에 900~1575 &amp;Omega; 의 풀업 저항이 있다. 디바이스는 VBUS가 0.8V 이상인 것을 검출한 이후 1초 내에 연결돼야 하는데, 전력이 약하거나 모두 소모된 배터리를 상요하는 디바이스는 제외&lt;/li&gt;
&lt;li&gt;호스트가 새 디바이스 정보를 얻는다.&lt;br /&gt;: 각 허브는 인터럽트 엔드포인트를 이용해 발생한 이벤트가 허브인지 포트인지 보고.&lt;br /&gt;&amp;nbsp;호스트는 발생한 이벤트에 대해 자세히 알아내기 위해 Get Port Status 리퀘스트를 허브로 전송&lt;br /&gt;&amp;nbsp;허브는 호스트로부터 반환된 정보를 통해 새 디바이스를 호스트에 장착했음을 감지&lt;/li&gt;
&lt;li&gt;허브는 디바이스가 풀스피드인지 로우스피드인지 감지&lt;br /&gt;: 신호선 전압을 검사해 디바이스가 로우스피드인지 풀스피드인지 판단&lt;/li&gt;
&lt;li&gt;허브가 디바이스를 리셋&lt;br /&gt;: 호스트가 새 디바이스 장착을 알아채면 Set Port Feature 리퀘스트를 허브로 보내 포트 리셋을 요청&lt;/li&gt;
&lt;li&gt;호스트는 풀스피드 디바이스가 하이스피드도 지원하는지 확인&lt;/li&gt;
&lt;li&gt;허브는 디바이스와 버스 사이의 신호 경로를 설정&lt;/li&gt;
&lt;li&gt;호스트는 Get Descriptor 리퀘스트를 보내 기본 파이프의 최대 패킷 크기를 알아낸다.&lt;/li&gt;
&lt;li&gt;호스트가 주소를 할당한다.&lt;br /&gt;: Set Address 리퀘스트&lt;/li&gt;
&lt;li&gt;호스트는 디바이스 기능에 관한 정보를 읽어온다.&lt;br /&gt;: Get Descriptor 리퀘스트&lt;/li&gt;
&lt;li&gt;호스트가 디바이스에 추가 정보를 요청&lt;/li&gt;
&lt;li&gt;호스트가 디바이스 드라이버를 할당하고 메모리로 가져온다.&lt;br /&gt;: 윈도우 호스트는 INF 파일을 이용해 최적의 드라이버를 식별. INF 파일은 USB 클래스용 시스템 파일 또는 제조자 제공 파일이다. 이 안에는 디바이스 Vendor ID, Product ID가 들어있다.&lt;/li&gt;
&lt;li&gt;호스트 디바이스 드라이버가 컨피규레이션을 선정&lt;br /&gt;: Set Configuration 리퀘스트 전송. 디바이스가 요청 받은 Configuration을 수신하면 요청받은 컨피규레이션을 활성화. 디바이스는 설정됨 (Configured) 상태로 전환되고 인터페이스 활성화&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;*OS나 OS 버전에 달라질 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;디바이스 제거&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;사용자가 버스에서 디바이스를 제거하면 허브는 디바이스를 장착했던 포트를 비활성화한다. 그 후 허브가 호스트에게 이벤트가 발생했음을 알리고, 호스트가 디바이스 제거를 알아챈 후 Get Port Status 리퀘스트를 보내 어떤 이벤트가 발생했는지 확인. 이제 디바이스가 장치 관리자에서 사라진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;성공적인 열거를 위한 팁&lt;/span&gt;&lt;/h3&gt;
&lt;p&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;이벤트는 정해진 순서로 발생하지 않을 수 도 있다.&lt;/li&gt;
&lt;li&gt;제어 전송은 재빠르게 이루어져야 하며 유사시에는 신속하게 포기해야한다.&lt;/li&gt;
&lt;li&gt;호스트가 요청한 데이터보다 많이 보내면 안된다.&lt;/li&gt;
&lt;li&gt;필요하면 ZLP(zero-length data packet)를 보낸다.&lt;/li&gt;
&lt;li&gt;지원하지 않는 리퀘스트는 STALL로 응답&lt;/li&gt;
&lt;li&gt;주소를 너무 빨리 지정하면 안된다.&lt;/li&gt;
&lt;li&gt;서스펜드 상태에 대한 준비를 해야한다.&lt;/li&gt;
&lt;li&gt;다른 호스트 컨트롤러 환경에서도 테스트해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2 디스크립터&lt;/p&gt;
&lt;p&gt;2-1 디스크립터 유형&lt;/p&gt;
&lt;p&gt;2-2 디바이스&lt;/p&gt;
&lt;p&gt;2-3 디바이스 한정자&lt;/p&gt;
&lt;p&gt;2-4 컨피규레이션&lt;/p&gt;
&lt;p&gt;2-5 다른 속도 컨피규레이션&lt;/p&gt;
&lt;p&gt;2-6 인터페이스 연관 디스크립터&lt;/p&gt;
&lt;p&gt;2-7 인터페이스 디스크립터&lt;/p&gt;
&lt;p&gt;2-8 엔드포인트&lt;/p&gt;
&lt;p&gt;2-9 슈퍼스피드 엔드포인트 짝&lt;/p&gt;
&lt;p&gt;2-10 슈퍼스피드 플러스 등시성 엔드포인트 짝&lt;/p&gt;
&lt;p&gt;2-11 문자열&lt;/p&gt;
&lt;p&gt;2-12 바이너리 오브젝트 스토어와 디바이스 기능&lt;/p&gt;
&lt;p&gt;2-13 OTG 디스크립터&lt;/p&gt;
&lt;p&gt;2-14 마이크로소프트 OS 디스크립터&lt;/p&gt;
&lt;p&gt;2-15 USB 2.0용 디스크립터로 업데이트&lt;/p&gt;
&lt;p&gt;2-16 USB 3.1용 디스크립터로 업데이트&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>USB</category>
      <author>Charizard</author>
      <guid isPermaLink="true">https://chardoc.tistory.com/14</guid>
      <comments>https://chardoc.tistory.com/14#entry14comment</comments>
      <pubDate>Sun, 17 Jan 2021 19:37:13 +0900</pubDate>
    </item>
  </channel>
</rss>