참고 : https://www.flashrom.org/Development_Guidelines#Adding.2Freviewing_a_new_flash_chip

내가 만들 chip : MX25L3233F

참고 chip : MX25L3273E


git 을 통해 https://github.com/flashrom/flashrom 를 설치한다. flashrom 에서 현재 지원되지 않는 칩의 경우 추가할 수 있는데, 그 방법을 확인해보고 해보았다.


새로운 칩 정보를 넣는 방법은 아래 링크에 자세히 써있다.

https://www.flashrom.org/Development_Guidelines#Adding.2Freviewing_a_new_flash_chip


저 링크의 내용을 따라 새로운 칩 정보를 넣어본것을 아래에 정리해본다.



3. First, find the best* IDs in the datasheet (*FIXME: this needs to be explained together with the probing somewhere else in detail) and check if the ID exists in flashchips.h already

  >> #define MACRONIX_MX25L3205 0x2016 이런식으로 되어있는데, 여기서 0x2016의 의미는 데이터 시트에 보면 ID Definitions 값 중 RDID 값이 있다. 앞부분 1비트는 장비 제조사 비트, 다음 2비트가 모델 비트다. 여기에 RDID 2번째 비트 값을 의미한다.


7. We encode various features of flash chips in a bitmask named .feature_bits. The various possibilities can be found in flash.h.

  >> MX25L3273E에 FEATURE_WRSR_WREN | FEATURE_OTP,로 되어있고, DataSheet에 otp 검색하니까 있어서 똑같이넣음


8. .tested is used to indicate if the code was tested to work with real hardware, its possible values are defined in flash.h. Without any tests it should be set to TEST_UNTESTED.

  >> TEST_UNTESTED 로 설정


9. .probe indicates which function is called to fetch IDs from the chip and to compare them with the ones in .manufacture_id and .model_id. This requires some knowledge or source reading. For most SPI flash chips probe_spi_rdid is the right one if the datasheets mentions 0x9f as an identification/probing opcode.

  >> 9f 검색하니까 rdid 커맨드 지원해서 그대로 납둠


11. .block_erasers stores an array of pairs of erase functions (.block_erase) with their respective layout (.eraseblocks).

  1. .block_erase is similar to the probing function. You should at least check that the opcode named in the function name is matching the respective opcode in the datasheet.
>> 참고 chip을 보니, 20, 52, d8, 60, c7이 erase 커맨드임. 그래서 erase 커맨드 hex값을 확인했더니 같았음.

2. Two forms of .eraseblocks can be distinguished: symmetric and asymmetric layouts. Symmetric means that all blocks that can be erased by an opcode are sized equal. In that case a single range can define the whole layout (e.g. {4 * 1024, 256} means 256 blocks of 4 kB each). Asymmetric layouts on the other hand contain differently sized blocks, ordered by their base addresses (e.g. {{8 * 1024, 1}, {4 * 1024, 2}, {16 * 1024, 7}}describes a layout that starts with a single 8 kB block, followed by two 4 kB blocks and 7 16 kB blocks at the end).
      >> 지우는 사이즈를 의미함. 예로 참고하는 칩의경우 52의 경우 32K의 블록을 지우는 거니까 {32 * 1024, 128}로 되어있었음. 같은 사이즈의 칩이고, 다 같았기 때문에 그대로 둠 


12..printlock is a misnomer to some extent. It is misused not only to print (write) protected address ranges of the chip, but also to pretty print the values of the status register(s) - especially true for SPI chips. There are a lot of existing functions for that already and you should reuse one if possible. Comparing the description of the status register in the datasheet of an already supported chip with that of your chip can help to determine if you can reuse a printlock function.

  >> Block Lock Protection에 있는 정보를 비교해서 작성함. 두개의 칩이 같은 내용이 적혀있어 그대로 진행... 


13, .unlock is called before flashrom wants to modify the chip's contents to disable possible write protections. It is tightly related to the .printlock function as it tries to change some of the bits displayed by .printlock.

  >> 잘 모르겠음..ㅠㅠ 일단 그대로 둠


14. .write and .read are function pointers with the obvious meaning. Currently flashrom does only support a single function each. The one that is best supported by existing programmers should be used for now, but others should be noted in a comment if available.

  >> 참고 칩의 256이 page 단위길래 검색했더니 같음. read도 0x0b로 fastread 값이 동일함


15. .voltage defines the upper and lower bounds of the supply voltage of the chip. If there are multiple chip models with different allowed voltage ranges, the intersection should be used and an appropriate comment added.

  >> minimum, maximum 값이다. 동일함




flashchips.c 에 수정한값.



{

.vendor = "Macronix",    /*HANA*/

.name = "MX25L3233F",

.bustype = BUS_SPI,

.manufacture_id = MACRONIX_ID,

.model_id = MACRONIX_MX25L3205,

.total_size = 4096,

.page_size = 256,

/* OTP: 64B total; enter 0xB1, exit 0xC1 */

.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,

.tested = TEST_UNTESTED,

.probe = probe_spi_rdid,

.probe_timing = TIMING_ZERO,

.block_erasers =

{

{

.eraseblocks = { {4 * 1024, 1024} },

.block_erase = spi_block_erase_20,

}, {

.eraseblocks = { {32 * 1024, 128} },

.block_erase = spi_block_erase_52,

}, {

.eraseblocks = { {64 * 1024, 64} },

.block_erase = spi_block_erase_d8,

}, {

.eraseblocks = { {4 * 1024 * 1024, 1} },

.block_erase = spi_block_erase_60,

}, {

.eraseblocks = { {4 * 1024 * 1024, 1} },

.block_erase = spi_block_erase_c7,

},

},

.printlock = spi_prettyprint_status_register_bp3_srwd,

.unlock = spi_disable_blockprotect_bp3_srwd,

.write = spi_chip_write_256,

.read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */

.voltage = {2700, 3600},

},



이렇게 해서 make 하면 됨.. 

./flashrom -p linux_spi:dev=/dev/spidev0.0 -V 


근데 -V 옵션을 주고 보면 RDID 값을 확인할 수 있는데, 0x00 0x0000 으로 출력되는걸 보니 장비 칩이랑 SPI 통신이랑 원활하게 이루어 지지 않는것같다.


./flashrom -L  하면 방금 추가한 MX25L3233F 도 볼 수 있음. 




'임베디드' 카테고리의 다른 글

ubuntu 에 searchsploit, findsploit 설치하기  (0) 2017.09.01
kali binwalk 삭제 후 다른버전 설치하기  (0) 2017.02.15
glibc 버전 확인하기  (0) 2016.03.24
lz4 latency 압축 해제하기  (0) 2015.05.14
linux shadow, passwd  (0) 2015.05.13


1. 인천 -> 홍콩 -> 요하네스버그 -> 리빙스턴







짐은 정말 간소하게 챙겼다. 기내용 21인치 캐리어에 내 베개로 사용할 라이언 바디필로우를 넣어도 텅텅 비었을 정도 ㅋㅋㅋㅋㅋㅋ
옷도 활동성 좋은 츄리닝, 나이키 운동복 위주로 챙겼다. 이건 신의 한수였음 ㅋㅋㅋ 바람이 많이 불어서 모래가 엄청나게 휘날렸기 때문!!

어쨌든, 저렇게 간단하게 짐을 싸고 장을 보러 갔다.




나미비아에서 계속 캠핑을 할 예정이었기 때문에 주로 간편하게 먹을 수 있는 음식들로 준비했다. ㅋㅋㅋㅋㅋㅋ


체크인할 때 우리의 비행 여정 중에 환승 시간이 타이트하기도 했고, 여러번 환승을 할 예정이라 수하물이 못 따라 올 경우를 대비하여 기내 수하물로만 가져갔다. 음식은 위탁 수하물로 부쳤다. ㅋㅋㅋ 음식 가방을 들고 아빠가 계속 낑낑거렸었는데 그 이유가 있었다. 위탁 수하물 무게 체크하는데 음식 가방 무게만 20KG 나와서 깜짝 놀랐던 기억이..ㅋㅋㅋㅋㅋㅋ 피난가는줄?


원래, 첫 비행 일정은 이랬다.
19:45 ~ 22:20   인천 -> 홍콩
1시간 반 대기
23:55 ~ 7:05   홍콩 -> 요하네스버그

그런데!!!!!!!!!!!지연 되어서 20:30에 출발... 어휴.. 진짜 홍콩가는 비행기 안에서 얼마나 식은땀이 났는지 모르겠다.거의 한시간이 지연되었으니, 우리에게 환승에 주어진 시간은 단 30분 !!!!!!!!!!!!!!!!!!!! 우린 `아... 우리의 아프리카 여행은 이렇게 끝나는구나. 앞으로 11일 동안 홍콩에서 여행해야하나?` 라고 생각했다 진짜 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
근데 웃기게도 한시간이 늦을 줄 알았던 비행시간이 거의 비슷하게 도착했다!!!! 한 5~6분 정도 늦었나??
암튼, 그래서 다행이도 홍콩에서 무사히 환승을 했다. 그리고 홍콩에서 내리자마자 요하네스버그로 가는 비행의 항공사인 남아프리카 에어라인에서 승무원이 우리 이름이 적힌 피켓을 들고 기다리고 있었다. 신기했다. 패키지도 아니고 ㅎㅎㅎㅎㅎㅎㅎㅎㅎ 승무원 덕분에 헤매지 않고 바로 환승수속을 했고, 요하네스버그로 가는 비행기를 잘 탈 수 있었다.


ㅋㅋㅋ 홍콩->요하네스버그로 가는 비행기는 남아프리카 항공의 SA 287 이었는데 사진에서 처럼 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 보통의 비행기처럼 앞에 나오는 게임이라던가 영화라던가 볼 수 있는 화면이 동작하지 않았다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 매우 당황... 13시간을 그냥 내리 잠만 자고 갔다... 심심해 죽는줄 알았다ㅠ_ㅠ


이름을 잘못 작성하여 걱정했던 요하네스버그->리빙스턴 항공권도 별 일 없이 무사히 도착했고, 공항 앞에서 우린 택시를 잡고 바로 숙소로 갔다. 흥정하는 사람에게 우리 호텔 주소 보여주니까 OK 하더라.
근데 내가 좀 더 돈을 아껴보겠다고 리빙스턴 도착(잠비아)으로 해서 숙소(짐바브웨)까지 가려면 택시를 세 번 타야했다.



리빙스턴 공항 -> 잠비아 국경 -> 국경과 국경 사이 -> 짐바브웨 국경 -> 숙소| 1 | 2 | 3 |


어휴.. 바보 ㅠㅠ 공항앞에서 호객행위를 하는 사람들이 많고 한사람과 일단 계약하고 나면 그 사람이 다음 택시기사(?) 를 연결해준다. 정확하게 금액은 기억이 안나 적을 수 없을 것 같다 ㅠㅠㅠ
암튼, 비자는 우리가 들어오는 날 잠비아를 거쳐서 짐바브웨를 가고 다음날 구경을 위해 또 잠비아 편으로 갈거고 나미비아로 가는 비행기는 또 짐바브웨에서 출발하는 빅토리아 폭포 공항이었기 때문에 국경을 여러번 넘어야했다. 그래서 30일인가? 정확한 날짜는 기억이 안나지만 한 번 발급하면 여러번 국경을 넘을 수 있는 비자를 선택했다.

한국에서는 UNI 비자, KAZA 비자라고 둘 다 부르는것 같은데 정식 명칭은 뭔지 모르겠다... 여권을 보면 나와있을텐데ㅠㅠ 확인하기 귀찮다... 

출발하기 전에 인터넷 검색 할 땐 발급이 일시 중지된 상태라고 나와서 걱정했는데 막상 도착해서 입국심사할 때 KAZA 비자 물어보니까 된다더라.



잠비아랑 짐바브웨 국경은 진짜 어마무시하게 허름하다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
기대 완전 이하 




저 차 뒤에 있는 건물이 국경에 있는 출국심사? 하는 곳


그냥 원숭이들도 막 돌아다닌다. 완전 문화충격.




이건 국경과 국경 사이. 원숭이들이 엄청나게 많다.






이게 차타고 빅토리아 폭포 브릿지에서 찍은 사진!! 
우리가 빅토리아 폭포 브릿지를 가본게 이게 마지막이 될줄이야............................................................ ㅠ_ㅠ

하아...


3번 택시기사한테 빅토리아 폭포에서 하는 엑티비티 업체 아냐고 추천해달라고 했다.
그랬더니 Wild Horizons  라는 업체를 추천해주고, 바로 데려다도 줬다.

너무 친절했음!!!




빅토리아 폭포 액티비티 가격은 이랬다.



우리는 선셋 크루즈랑 짚라인, 그리고 헬리콥터 13분 이렇게 3개를 선택했다.


원래 500달러 이상이었는데, 현금으로 하겠다고 하고 이야기를 잘 해서 2사람 500달러에 맞춰서 진행했다.

액티비티에는 모두 숙소픽업이 포함되어있는 가격이다.



액티비티 예약을 모두 다 하고 3번 택시기사가 숙소로 데려다주면서, 우리에게 딜을 걸어왔다.

"너네 언제 돌아가니?"
"우리 내일 돌아가"
"그럼 내가 다시 데려다줄까? 싸게해줄게"
"OK 좋아."

대부분의 택시기사들이 이렇게 딜을 하는 것 같았다.
가격은 정확히 기억나지 않지만, 싸게했던것 같다.


숙소는 The N1 호텔이었는데 가격대비 매우 만족스러웠다.

도착하고 숙소 사진을 찍은게 없다ㅠㅠ
다음날 떠나기 전에 수영장 앞에서 아빠 사진 찍어준것밖에...



숙소에 체크인을 하다가 다른 한국인 여행객을 만났다. 그분들은 부부로 둘째 가지기 전에 여행온거라고 하셨다.

부러웠다..ㅠㅠ


그분들과는 여행 코스는 비슷한데 날짜가 달라서 ㅋㅋ 나중에 나미비아에서 만나서 맥주한잔 하기로 했다. 



첫날은 숙소에 도착하니 4시쯤 되어서 숙소 근처에 있는 햄버거 집에가서 대충 요기를 하고 선셋 크루즈를 타러 갔다.







2. 빅토리아 폭포 - 1일차(선셋 크루즈)

우리는 첫날 선셋 크루즈하고, 다음날 짚라인, 그리고 헬리콥터 13분을 하기로했다.


선셋 크루즈는 솔직히 별 기대 안했는데 너무 재미있었다.
하마도 보고 악어도 보고 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 인증샷 제대로 남겼다.












1. 빅토리아 폭포, 나미비아 여행 후기 요약

하아.. 벌써 여행 다녀온지 5개월이 넘었다. 진짜 잊지 못할 추억이 된 것 같다. 그 별이 쏟아질 것 같은 밤 조용한 캠핑장에서 모닥불을 피워놓고 밥을 해먹는 그런 기분을 언제 또 느껴볼 수 있을까? 돈이 조금만 덜 들었다면 또 가고 싶을 정도다.


어쨌든, 무사히 다녀왔고 그 여운이 이미 사라져 이성적인 지금 후기를 다시 써보려한다.

나미비아 여행, 빅토리아 폭포 여행을 준비하는 다른 사람들을 위해서 !!


<여행 후기 요약 정리> 를 하자면,

  1. 일정 : 2017.04.29 ~ 2017.05.09 , 8박 11일, 빅토리아 폭포 - 나미비아 일주

  2. 금액

    1. 항공 + 렌터카 + 가기전 예약한 숙소 4곳 (에토샤 캠핑장 2곳, 리빙스턴 1곳, 나미비아 1곳) 등 사전 결제 비용 : 3,921,255원
    2. 현지에서 사용한 금액 (카드 사용) : 2,220,079원
    3. 달러 환전 비용 : 1,131,370원

총액 : 7,272,704원 / 1인당 총액 : 3,636,352원

3. 기타 참고 할 내용

    • 가기전에 사전 결제 비용에 항공기 일정이 변경되어서 항공권이 좀 복잡하게 되었음. 취소 수수료 등이 부과됨
    • 항공권에 이름을 잘못적어서 돌아오는 날 비행기 표를 재구매해야했음. 따라서 현지에서 사용한 금액에는 나미비아(윈드후크)->남아공(요하네스버그) 가는 비행기 값이 포함됨.
    • 카드 사용할 수 있는 곳에선 무조건 카드를 사용했고 현금 사용을 최소화 하였음. 대부분 카드 사용이 가능했음.
    • 네비게이션은 Google Map을 이용함. 완전 좋음.
    • 차가 우리나라랑 반대로 있어서 렌트를 하려면 운전에 능숙한 사람이 꼭 필요함. 아빠의 경우 운전 경력이 몇 십년인데도 하루동안은 고생함. 수동 차를 빌렸는데, 운전 테스트 해보고 못미더웠는지 렌트 못해주겠다고 한 경우도 봄.

2. 실제 일정 및 결제 내역

내 이전 글에도 나와있듯 난 일정을 몇번째 바꾼건지 모르겠다ㅠ_ㅠ




실제 일정은 위와 같이 이루어졌고, 저 표에서 빨간색 숙박만 예약하고 갔고, 나머지는 다 현지에서 바로 보이는 곳 또는 추천받아서 갔다.

위 일정대로 움직이는게 어렵진 않지만, 마지막엔 꽤나 타이트한 일정이 된다.

특히 에토샤에서 스와코프문크까지의 이동은 아침부터 저녁까지 운전을 계속해야한다... 내가 운전하지도 않았지만 조수석에 앉아있던 내가 이만큼이나 힘들었는데, 운전을 계속 한 아빠는 얼마나 피곤했을까... 문득 죄송스럽네ㅠㅠ



사전 결제 상세 내역이다. 현지에서 사용한 금액은 정리를 도저히 할 수 없어서 포기했다...ㅎㅎ 시간 순서가 달라서 더 헷갈릴수도... 사실 항공 일정이 변경되지만 않았어도 중간에 수수료라던지 이런거에 아낄 수 있었지만........... 어휴 생각안할란다..

암튼, 결제 상세 내역은 여기까지.


다음엔 빅토리아 폭포, 나미비아 나눠서 사진들이랑 자세히 써볼까한다.


그전에 엑기스 사진만 모아서 만든 여행 포토북 사진을 업로드~ㅎㅎ






+ Recent posts