All posts by RSR

ARM Secure Boot Procedure

용어 정리
TBB – Trusted Board Boot
CoT – Chain of trust
iROM – Internal ROM
BL – Boot Loader
OM – Operation Mode
iSRAM – Internal SRAM

1

리셋
시스템이 리셋되면 iROM부터 PC가 시작된다
iROM에는 BL0을 수행하는 코드가 들어있어 OM Pin으로부터 부팅매체를 찾아 해당 디바이스로부터 BL1을 iSRAM으로  읽어들인다. 읽어들이는 과정에서 Secure Boot가 활성화 되어있으면 BL1의 무결성을 검사하고  BL1으로 제어권을 넘기게 된다.
BL0은 칩 제조사가 생산시점에서 기록하게되며 삼성 휴대폰의 경우 삼성 반도체가 역할을 맡는다(추정)

제어권을 넘겨받은 BL1은 BL2를 로딩하는데 역시 Secure Boot 활성 여부에 따라 무결성을 체크하고 BL2로 제어권을 넘겨준다
BL1은 2차벤더가 기록하게되며 삼성 휴대폰의 경우삼성 모바일 사업부, ODROID의 경우 HARDKERNEL에서 책임을 담당한다(강한 추정)

BL2는 일반적으로 u-boot이나 BLOB, grub 과 같은 널리 알려진 Boot Loader가 사용된다. (주로 u-boot)
ODROID의 경우 BL1에서 BL2의 무결성 검사를 진행하지 않아 사용자가 BL2을 변경할수 있다
삼성의경우 BL2의 무결성 검사에 실패하면 Knox를 trip 시켜 보안서비스 동작을 막는것으로 확인된다.

2Boot Loader를 검증하는데에 RAS 서명이 사용되며 무결성 검사에 실패하면 CPU는 멈추게 된다.

대부분의 경우 BL1이 문제가 되며 (…) 자세하고 정확한 내용은 CPU의 USER Manual 을 참고해야 한다(그런데 구할길이 NDA 밖에 없다…)

참고
https://github.com/ARM-software/arm-trusted-firmware/blob/master/docs/firmware-design.md
https://github.com/ARM-software/arm-trusted-firmware/blob/master/docs/trusted-board-boot.md
https://github.com/limingth/ARM-Resources/blob/master/tiny210/Datasheet/S5PV210_UM_REV1.1.pdf
http://prog3.com/sbdm/blog/yueqian_scut/article/details/38983607
http://prog3.com/sbdm/blog/yueqian_scut/article/details/39004727
http://eoworld.tistory.com/entry/mango210-%EB%B6%80%ED%8C%85-%EA%B3%BC%EC%A0%95
http://chlrbgh0.tistory.com/entry/2-%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%8B%9C%EC%9E%91%EC%9D%80-Bootloader%EB%A7%90%EA%B3%A0-%EA%B5%AC%EC%A1%B0-%ED%8C%8C%EC%95%85%EB%B6%80%ED%84%B0
http://blog.naver.com/dong880510/140162794298

ps. 중국어 배우고싶다
XDA 보니까 이런게 있다 (http://forum.xda-developers.com/showthread.php?t=1233273)

Universal Flash Storage / Embedded MultiMediaCard

Universal Flash Storage
S6, S6 edge가 최초의 UFS2.0 폰임 (근데 iPhone6보다 느림)
http://www.anandtech.com/show/9146/the-samsung-galaxy-s6-and-s6-edge-review/7

UFS 는 USB와 같이 직렬통신으로 고속을 구현함
반면 eMMC는 병렬통신을 사용함으로써 속도향상에 무리가있음
SCSI 아키텍쳐 모델을 사용함, 커맨드 큐잉 가능
읽기쓰기명령이 동시에 가능, emmc에 비해 저전력(피크치는 높으나 빨리 처리하고 Idle 타버림)
아직은 비교적 고가

eMMC 5.0 – 400MB/s
UFS 2.0 – 720MB/s(HS-G2x2LANE) (사타 3.0보다 빠름!)

http://www.slideshare.net/BhaumikBhatt4/universal-flash-storage

 

Embedded MultiMediaCard
그냥 칩형태의 SD카드(MMC)라 생각하면 이해가 빠를거같다
MicroSD나 SecureDigital에 핀만 맞춰주면 리더기로 바로 읽힌다
고가의 eMMC 리더기 보면 저항 몇개랑 캐패시터가 전부이다
CMD, GND, VDD, CLK, DAT0 5가닥만 연결되어도 읽어진다(but 느려)

http://blog.skhynix.com/1312
http://www.androidpolice.com/2015/02/26/samsung-electronics-starts-mass-producing-industrys-first-128gb-universal-flash-storage-almost-certainly-galaxy-s6-bound/
http://www.androidpolice.com/2015/03/05/galaxy-s6-storage-benchmarks-show-it-blowing-all-past-phones-out-of-the-water/

linux 디스크 입출력 속도 확인 캐시 드랍

dd if=something of=somewhere bs=4K/1M/2M/4M count=testsize oflag=dsync

 

  • To free pagecache:
    # echo 1 > /proc/sys/vm/drop_caches
    
  • To free dentries and inodes:
    # echo 2 > /proc/sys/vm/drop_caches
    
  • To free pagecache, dentries and inodes:
    # echo 3 > /proc/sys/vm/drop_caches

     

 

 

http://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system

https://romanrm.net/dd-benchmark

https://www.thomas-krenn.com/en/wiki/Linux_I/O_Performance_Tests_using_dd

STM8S

DM00024550_STM8S003F3_Datasheet

PM0044_STM8 CPU programming manualpd

RM0016_STM8S_STM8A_Reference manual

리눅스에서 sdccstm8flash로 개발 가능

High-Quality-Mini-Board-STM8S003F3P6-Development-Board-Program-Module-With-Download-Serial-Port-Pin

알리에서 싸다고 몇개 구매했는데…. 지금 생각해보니 저렴하지 않은듯.. (2.5$)
회로도를 구하지 못했다.. J2를 쇼트시키면 PA3에 LED가 연결되어 있다

짜깁기 하여 IRQ로 UART 처리하는 코드

#include <string.h>
#include "stm8s.h" // stm9l.h랑 다른거다, 다른부분 다 비슷한데 CLK 부분이 DS랑 좀 다르다...

int uart_write(const char *str) {
	char i;
	for(i = 0; i < strlen(str); i++) {
		USART1_DR = str[i];
		while(!(USART1_SR & USART_SR_TXE));
	}
	return(i); // Bytes sent
}

unsigned char GetByte(void)
{
	while (!(USART1_SR & USART_SR_RXNE));
	return USART1_DR;
}

void PutByte(unsigned char Data)
{
    USART1_DR = Data;
    while (!(USART1_SR & USART_SR_TXE));
}

void USART_RX_ISR(void) __interrupt 18
{
	uart_write("GOT ST ");
	PutByte(GetByte());
	uart_write("\r\n");
}

int main() 
{
	int d;

	PA_DDR = 0x08; // PA3
	PA_CR1 = 0x08;
	
	CLK_DIVR = 0x00; // Set the frequency to 16 MHz
	CLK_PCKENR1 = 0x08; // Enable UART1

	USART1_CR2 = USART_CR2_TEN | USART_CR2_REN |USART_CR2_RIEN; // Allow TX & RX
	USART1_CR3 &= ~(USART_CR3_STOP1 | USART_CR3_STOP2); // 1 stop bit
	USART1_BRR2 = 0x03; USART1_BRR1 = 0x68; // 9600 baud
	
	__asm__("rim"); // Enable Interrupt
	
	while(1)
	{
		//PA_ODR ^= 0x08;
		for(d = 0; d < 29000; d++);
		//uart_write("Hello World!\r\n");
		//PutByte(GetByte());
	}
}

 

TIM1_CH3에 PWM 출력샘플 (아 이거하느라고 되게 애먹었는데..  OISR에서 or 연산이 제대로 안되서 그랬던거같다….)

int main() 
{

	TIM1_ARRH = 0x0F;
	TIM1_ARRL = 0xFF;
	
	TIM1_PSCRH = 0x00;
	TIM1_PSCRL = 0x00;
	
	TIM1_CR1 = 0x00; 
	TIM1_RCR = 0;
	
	TIM1_CCER2 = 0x0f;
	TIM1_CCMR3 = 0x70;
	TIM1_OISR = 0x7F;
	TIM1_CCR3H = 0x03;
	TIM1_CCR3L = 0xFF;
	TIM1_CR1 =0x01;
	TIM1_BKR = 0x80;

	while(1);
	return 0;
}

 

사용한 Makefile

SDCC=sdcc
SDLD=sdld
OBJECTS=myStm8.ihx
OBJECT=myStm8
.PHONY: all clean flash

all: $(OBJECTS)

clean:
	rm -f $(OBJECTS)

flash: $(OBJECT).ihx
	stm8flash -cstlinkv2 -pstm8s003f3 -w $(OBJECT).ihx

%.ihx: %.c
	$(SDCC) -lstm8 -mstm8 --out-fmt-ihx $(CFLAGS) $(LDFLAGS) $<

이왕 환경구성한거 몇개 더샀다
저렴하다(0.78$) 크리스탈이 없다(내부클럭 쓰나?…)
HTB11CtFMFXXXXadXFXXq6xXFXXXf
http://www.aliexpress.com/item/1pcs-lot-STM8S103F3P6-system-board-STM8S-STM8-development-board-minimum-core-board/32524292414.html