JTAG에서 플래시 메모리 접근 하는 원리가 궁금합니다.

teaeune의 이미지

보통 부트로더를 올릴때 JTAG를 이용하여 접근을 하는데요 . 어떤식으로 접근을 하는지 궁금 합니다.
플래시 메모리에 어떻게 접근 하는것이 가능 한지 궁금 합니다

gosping의 이미지

I2C를 이용해 디바이스 아이디를 지정해서 접근하는 걸로 알고 있습니다.
I2C는 여러 디바이스에 물려서 사용하기 때문에 각 디바이스 아이디로 디바이스를 구분합니다.

ed.netdiver의 이미지

오래된 일이라 기억도 불확실한데 잘 모르는 상태에서 말씀드려도 될지 모르겠습니다만, i2c와는 bus 규격이 다릅니다.

wikipedia에서 jtag이나 ieee1149.1관련해서 검색해보시면 나오지만,
원래 목적이 ic같이 집적화되어 그 내부 상태를 제대로 찍어볼수 없어서, test point를 내부에 두고 그 상태값을 확인해볼 요량으로 제안된 방법입니다.
쉽게 말씀드려 회로상에서 ic 리드선을 scope로 찍어보는 tp를 안에다 두고 주욱 연결해두었다고 보시면 될것 같습니다.

jtag chain은 cpu같은 ic내부에서 외부 pin chain만을 주욱 연결한 기본 chain외에(1번이던가...), 내부 메모리, register등을 연결한 chainn등 여러가지가 있습니다.
덕분에 jtag만으로 cpu의 run없이 gpio를 직접 제어하거나, register정보를 읽어올수가 있다거나 하는 식이 가능합니다.
통신 방식이 각 tp나 register file의 각 bit를 serialize한 방식이라 i2c와 비슷한 구석이 있습니다만,
i2c는 기본적으로 master/slave간의 request/response방식이라고 하면, jtag은 ic내부의 chain map을 알고 있다는 전제하에
해당 map bit를 쭈욱 읽어오거나 쓰는 형식으로 되어 있습니다.

flash fusing의 경우, addr/data bus를 직접 manipulation하는 방법도 있고, 내부 메모리로 일단 fusing algorithm을 적재하는데까지만 jtag을 쓰고, 그 다음엔 해당 algorithm과 공유메모리를 통해 write/read등 cmd 및 payload를 주고받는 식으로 해서
실제 fusing은 적재된 프로그램이 진행하도록 하는 방식도 있습니다.

적고보니 이거 엄하게 틀린 말을 한게 아닌가 싶은데, 잘못된 내용이 있으면 정정 부탁드립니다.
--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

jongwooh의 이미지

실질적인 구현 방법에는 여러가지가 있습니다만, 가장 많이 쓰이는 방법으로는 플래쉬 메모리에 값을 저장하는 코드를 램에 다운로드시키고, 해당 코드를 CPU에 수행시키면서, 플래쉬 메모리에 쓸 값을 읽어오도록 지정된 IO포트를 JTAG으로 에뮬레이션해서 쓰는 방식을 가장 많이 쓰는 것으로 알고 있습니다. 뭐, 기본적으로 JTAG는 CPU의 클럭을 포함한 입출력 핀 I/O를 가로채는 원리로 되어있는것이라...

참고로 대부분의 JTAG 부트로더 쓰기 코드는 프로그래머가 간섭할 수 없는 영역에 있습니다(감춰져 있다는 말이죠). 이걸 건드렸다가는 회복불능이 되니까요. 이걸 고치기 가능하게 공개해놓은 칩 벤더도 있긴 합니다만 극소수입니다.

Available only from the dark side.

you must know the power of dark side.

bushi의 이미지

... 두 가지 방식이 가능합니다.

1.
JTAG 을 통해 host PC 가 target CPU 의 각 핀들을 직접 제어하는 방법.
flash 를 접근하는 방법에 대한 구현은 host PC 에 해야 합니다.

2.
target CPU 에 연결된 외장 RAM 혹은 내장 RAM 을 사용가능하도록 초기화하고,
그곳에서 실행할 수 있는 바이너리를 전송한 다음 실행시키는 방법.
flash 를 접근하는 방법에 대한 구현은 target CPU 에서 구동될 바이너리에 구현해야 합니다.

처음 댓글다신 분이 언급한 I2C 는 아마도 I2C 방식의 EEPROM 을 말씀하신 것 같습니다.
아직까지 I2C EEPROM 을 사용해서 부팅하는 CPU 는 못 봤습니다만,
아무튼 이걸 예로 들어보면,
첫번째 방식을 택할 경우 I2C bus 제어및 EEPROM 의 제어에 관한 모든 것을 host PC 가
해야 합니다. target CPU 의 I/O pin 을 host PC 가 직접 제어하니까요.
두번째 방식을 택할 경우 target CPU 에 다운로드한 프로그램이 I2C bus 및 EEPROM 제어를
담당하게 됩니다.

여기까진 일반론이었고,
jongwooh 님의 댓글에서 언급된 일반적이지 않은 CPU 들의 경우 저마다 제각각입니다.
기본적인 downloader 혹은 monitor를 내장한 boot rom 등을 CPU 에 내장한 경우가 많은데,
이 경우는 JTAG 이 필요없으니 질문 내용과는 거리가 멉니다.
이런 CPU들은 I/O pin 몇개를 사용해서 초기기동 모드를 스위칭하도록 되어 있습니다.
아주 오래전에 EP9317 인가 하는 arm7 CPU 가 이런 식이었던 것을 실제로 경험한 적이 있습니다.

OTL

gosping의 이미지

다른분들의 댓글을 보고 제스스로 제가 한 말을 이해했습니다 --;

하드웨어보다 소프트웨어 쪽이다 보니 잘 모르고 답변드려서 죄송합니다.

예전에 N사의 싱가폴 지사에서 만든 보드가 Host CPU가 I2C를 이용해 전부 제어하는 형태였습니다.
bushi님 말씀대로 Host CPU가I 2C를 이용해서 EEPROM이나 Video Chip등을 제어했었는데
그것과 착각했었나 봅니다.

부트로더를 올리는 방식은 jongwooh님 말씀대로 JTAG를 이용해서 플래쉬메모리에 부트 코드를 다운로드 시키고 CPU가 그대로 수행하는 방법이었습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.