Как стать автором
Обновить

Siemens SGold: I/O сниффер

Время на прочтение35 мин
Количество просмотров13K
Сниффер — специальная программа для анализа и перехвата сетевого трафика, передачи данных через интерфейсы
и многого другого. В данном случае мы будем мониторить операции (чтение и запись) с портами ввода-вывода
на примере телефона линейки Siemens SGold и я постараюсь объяснить, как это всё работает.

image



Предисловие


У многих сразу вопрос о целесообразности и полезности данной затеи, ведь эти телефоны давно устарели.
Во-первых, давайте будем рассматривать телефон как просто некое устройство, которое имеет микроконтроллер на базе ARM926EJ-S (без документации) и нам хочется сделать свою прошивку для своих нужд, используя полученные данные. Во-вторых, научный интерес!

Теория


Так-с, что мы имеем? А мы имеем микроконтроллер PMB 8875 S-GoldLite на базе процессора Intel, то есть, ARM9. И как у любого нормального микроконтроллера, внутри него сидят устройства и готовые интерфейсы, такие как USART, SSC, I2C, PLL, RTC, таймеры, простите за выражение, EBU (External Bus Unit), и прочие страшные буржуйские аббревиатуры.

I/O порты

Как отмечалось ранее, есть какие-то там устройства и интерфейсы. И в 4-гигабайтном (32 бит же) адресном пространстве им уделены свои диапазоны. Да, адресное пространство нашего микроконтроллера физически разбито на:

0x00000000-0x00003FFF — SRAM #1
0x00080000-0x00097FFF — SRAM #2
0x00400000-0x0040FFFF — BootROM
0xF0000000-0xFFFFFFFF — Порты ввода/вывода, регистры встроенных устройств

А внешнюю оперативную память и ROM можно всунуть на свободный физический адресок c помощью пресловутого EBU.

Так вот, например, для устройства USART0 выделен диапазон F1000000-F1000084.
Выглядит это в рабочем состоянии как-то так:

image

Каждый WORDARM равен 4 байтам) в этом диапазоне является регистром для управления этим интерфейсом.
То есть, записывая определённые значения в определённые регистры, мы передаём команды или данные устройству,
а считывая с них — получаем данные и проверяем состояния.

Я забыл сказать, что USART0 (Универсальный Синхронный Асинхронный Приёмник и Передатчик) у нас используется как передатчик и приёмник по кабелю, грубо говоря, COM-порт, но с заниженным напряжением.
И давайте подробнее рассмотрим процесс по передаче 1 байта в простейшем случае:

#define USART_REG(a)        	* ( (unsigned int   *) ( a ) )	
#define USART0_BASE		0xF1000000

#define USART0_CLC		USART0_BASE		/* Clock Control Register */
#define USART0_ID		USART0_BASE + 0x08	/* Module Identification Register */
#define USART0_CON		USART0_BASE + 0x10	/* Control Register */
#define USART0_BG		USART0_BASE + 0x14	/* Baudrate Timer Reload Register */
#define USART0_FDV		USART0_BASE + 0x18	/* Fractional Divider Register */
#define USART0_TXB		USART0_BASE + 0x20	/* Transmit Buffer */
#define USART0_RXB		USART0_BASE + 0x24	/* Receive Buffer */
#define USART0_FCSTAT		USART0_BASE + 0x68	/* Flowcontrol status register */
#define	USART0_ICR		USART0_BASE + 0x70

void USART0_InitAndTransmit()
{
	unsigned char tx = 0xDD;

	// Включаем интерфейс
	USART_REG(USART0_CLC) = 0x200;
	// Устанавливаем баудрейт с помощью делителей
	USART_REG(USART0_BG)  = 0x05;
	USART_REG(USART0_FDV) = 0xDA;
	// Устанавливаем режим работы
	USART_REG(USART0_CON) = 0x8811;

	// Записываем байт в буфер
	USART_REG(USART0_TXB) = tx & 0xFF;
	// Ждём пока байт не передастся на конечное устройство
	while(!(USART_REG(USART0_FCSTAT) & 2));
	// Сбросим флаги прерывания
	USART_REG(USART0_ICR) = (USART_REG(USART0_ICR)) | 0x02;
}

Ну, то есть чтобы что-то передать устройству, надо записать в эти чёртовы регистры, ну и считывать с них же, этим и будем пользоваться для перехвата.

MMU и Таблица переадресации

MMU — устройство в микроконтроллере для управления памятью и адресным пространством. Оно может быть включено, а может и нет, но у нас оно работает и устанавливает режимы доступа к различным участкам памяти, и самое интересное — может переадресовывать или зеркалить адреса.

Я заводил речь о физических адресах и всё такое, но ещё существуют и виртуальные, которые можно создать с помощью MMU.
Всё 4-гигабайтное адресное пространство прописывается в маленькой табличке переадресации.

Таблица переадресации — это участок памяти, обычно в SRAM, в которой описано 4096 Мб адресного пространства. И каждая ячейка размером с WORD описывает 1 Мб. Нехитрыми вычислениями можно узнать её размер — 16 Кб. Ещё есть второй уровень таблиц, но не будем лезть в дебри, это необязательно. Так вот, положение ячейки от начала говорит MMU о физическом адресе,
который надо транслировать в виртуальный, значение которого в ней и прописывается. В ячейке также описывают атрибуты этого пространства в 1 Мб — кешированный, буферизированный, режимы доступа. Если ячейка пуста, то есть равна 0x00000000 (ну или хотя бы биты отвечающие за доступность), то адрес, который она должна описывать не существует, и процессор его не увидит.

Для понимания примерчик такой вот таблицы:
Адрес ячейки Значение Описание
0x0000 0x00000C12 Описывает 0x00000000-0x000FFFFF / RW / Некешир. Небуф.
0x0004 0x00100C12 Описывает 0x00100000-0x001FFFFF / RW / Некешир. Небуф.
0x0008 0x00200C12 Описывает 0x00200000-0x002FFFFF / RW / Некешир. Небуф.
0x000C 0x00300C12 Описывает 0x00300000-0x003FFFFF / RW / Некешир. Небуф.
0x0010 0x00400C12 Описывает 0x00400000-0x004FFFFF / RW / Некешир. Небуф.
.....
0x3840 0xF1000C12 Зеркалит с 0xF1000000-0xF10FFFFF на 0xE1000000-0xE10FFFFF
.....
0x3C40 0xF1000C12 Описывает 0xF1000000-0xF10FFFFF / RW / Некешир. Небуф.
.....
0xFFFC 0x00000000 Адреса 0xFFF00000-0xFFFFFFFF процессор не видит

И да, эту таблицу мы описываем сами и где захотим, в любом участке RAM или Flash, а чтобы MMU знала о ней, необходимо прописать адрес в регистре сопроцессора CP15, но и это для нас не важно.

Векторы прерывания

Прерывания бывают железные (от устройств), программные (через специальные инструкции BKPT и SWI) и от ошибок (исключений).
В результате прерывания процессор, как ни странно, прерывает исполнение инструкций на текущим адресе и переходит на так называемый вектор прерывания, то есть определённый адрес, в зависимости от типа прерывания. И на нём обычно размещается инструкция для перехода на обработчик этого прерывания / исключения.
Рассмотрим эти векторы:
Адрес нижний Адрес верхний Вектор Описание
0x00000000 0xFFFF0000 Reset Сброс
0x00000004 0xFFFF0004 Undefined_Instruction Неизвестная инструкция
0x00000008 0xFFFF0008 SWI Программное прерывание
0x0000000C 0xFFFF000C Prefetch_Abort Отказ считывания команды
0x00000010 0xFFFF0010 Data_Abort Отказ доступа к данным
0x00000014 0xFFFF0014 RESERVED Зарезервировано
0x00000018 0xFFFF0018 IRQ Железное прерывание
0x0000001C 0xFFFF001C FIQ Железное прерывание

В Siemens SGold они выглядят вот так:

image

Но нас интересует только один вектор Data Abort. Это прерывание возникает, когда процессор пытается совершить
операцию чтения / записи из несуществующего адреса или адреса, к которому в данный момент нет доступа.
Прошивка Siemens SGold использует этот вектор просто как регистрацию ошибки и выключение устройства с характерным звуком.
То есть обработчик, указатель которого находится по адресу 0x00000030, можно безболезненно подменять на свой.

Механизм отслеживания операций чтения/записи

Теперь, когда мы введены в курс дела, можно и рассмотреть, как эта фиговина работает-то.
Обратим свой взор на первую картинку в статье, не побоюсь этого слова, блок-схему.
Взглянем на код ARM — ассемблера (не ищите в нём смысла или законченности):

LDR	R1, =0xF4700000 ;  Помещение в регистр R1 значения 0xF4700000
LDR	R2, [R1, #0x14] ;  Чтение в регистр R2 из адреса в регистре R1 + 0x14 (в итоге из адреса 0xF4700014)
BIC	R2, R2, #1	;  Очистка 0-го бита в регистре R2
STR	R2, [R1, #0x14] ;  Запись значения регистра R2 в адрес в регистре R1 + 0x14 (в итоге в адрес 0xF4700014)
MOV	R2, #2		;  Помещение в регистр R2 значения 2

Самое интересное начинается на инструкции:

LDR	R2, [R1, #0x14] ;  Чтение в регистр R2 из адреса в регистре R1 + 0x14 (в итоге из адреса 0xF4700014)

Здесь процессор сначала спрашивает у MMU: «Адрес 0xF4700014 существует ли и есть ли к нему доступ?»
MMU говорит, что да и процессор довольный считывает из адреса и продолжает работу.

Подменяем обработчик исключения Data Abort на свой, для этого достаточно поменять указатель на адресе 0x00000030.
Зеркалим через таблицу переадресации адресное пространство 0xF4700000-0xF47FFFFF на 0xE4700000-0xE47FFFFF,
а подлинный адрес там стираем. Получается что 0xF4700014 — не существует, то есть процессор его не видит, зато есть
0xE4700014 — транслированный (отзеркаленный) с физического адреса 0xF4700014.

Повторяем код, процессор натыкается на ту самую инструкцию, спрашивает о существовании адреса и тут на тебе здрасте, нету!
Паника. В таких случаях процессор прыгает на вектор прерывания и попадает куда? Правильно, в наш обработчик. Мы бережно сохраняем контекст прерванной программы, чтобы ничто не потерялось и не затёрлось.
Далее, идёт эмуляция этой инструкции, но с учётом что адреса-то нету и вместо него надо брать 0xE4700014.
Под эмуляцией имеется: определение местоположения инструкции, анализ того, что она должна делать, собственно это всё и делаем, применяем к контексту (помните, который сохраняли), запишем все данные об операции (адрес инструкции, адрес регистра, значение и тип операции) куда-нибудь, преспокойно восстанавливаем его и направляем процессор на следующую инструкцию.

Если прошивка будет выполнять операции с адресами 0xF4700000-0xF47FFFFF, то неизбежно будет попадать на обработчик, а он, в свою очередь, исправно вести журнал этих операций. Красота же! Правда заместо одной инструкции нужно выполнять огроменный обработчик, но на производительности и работоспособности слабо сказывается.

Реализация механизма


Я думаю, что реализация всего этого — сильно зависит от платформы и этот код никому ничего не даст,
но всё же будет как-то странно без этого. Всё разрабатывалось в среде IAR 4.2

arm_defs.h
#ifndef __ARM_DEFS_H__
#define __ARM_DEFS_H__

#define WORD(a)        * ( (unsigned int   *) ( a ) )
#define HWRD(a)        * ( (unsigned short *) ( a ) )
#define BYTE(a)        * ( (unsigned char  *) ( a ) )

#define INS_BIT(i,b)           ( ( i >> b )&1 )
#define I32_FIELD(i,b,e)       ( ( ( i << ( 31 - b ) ) >> 31 - b ) >> ( e ) )
#define I32_FIELD_FAST(i,e,m)  ( ( i >> e ) & m )
#define IARM_COND(i)           ( ( i >> 28 )&0xF )

#define IARM_Rn(i)          ( ( i >> 16 )&0xF )
#define IARM_Rd(i)          ( ( i >> 12 )&0xF )
#define IARM_Rs(i)          ( ( i >>  8 )&0xF )
#define IARM_Rm(i)          ( ( i >>  0 )&0xF )

#define IARM_ImmHi(i)       ( ( i >> 16 )&0xF )
#define IARM_ImmLo(i)       ( ( i >>  0 )&0xF )
#define IARM_Imm12(i)       ( ( i >>  0 )&0xFFF )

#define IARM_ShiftImm(i)    I32_FIELD_FAST(i,7,0x1F)
#define IARM_Shift(i)       I32_FIELD_FAST(i,5,3)

#define IARM_Shift_LSL      0
#define IARM_Shift_LSR      1

#define PC_ALIGN(pc)        (pc & 0xFFFFFFFE)

#define MAX_REGS   17

#define _R0        0
#define _R1        1
#define _R2        2
#define _R3        3
#define _R4        4
#define _R5        5
#define _R6        6
#define _R7        7
#define _R8        8
#define _R9        9
#define _R10       10
#define _R11       11
#define _R12       12
#define _SP        13
#define _LR        14
#define _PC        15
#define _CPSR      16

#define GET_PSR_N(cpsr)    ((cpsr >> 31)&1)
#define GET_PSR_Z(cpsr)    ((cpsr >> 30)&1)
#define GET_PSR_C(cpsr)    ((cpsr >> 29)&1)
#define GET_PSR_V(cpsr)    ((cpsr >> 28)&1)
#define GET_PSR_Q(cpsr)    ((cpsr >> 27)&1)

#define GET_PSR_I(cpsr)    ((cpsr >>  7)&1)
#define GET_PSR_F(cpsr)    ((cpsr >>  6)&1)
#define GET_PSR_T(cpsr)    ((cpsr >>  5)&1)
#define GET_PSR_M(cpsr)    ((cpsr)&0x1F)

#define SET_PSR_T(cpsr, i)  (cpsr |= ( i << 5))

#define MUSR           0x10 // User Mode
#define MFIQ           0x11 // FIQ Mode
#define MIRQ           0x12 // IRQ Mode
#define MSVC           0x13 // Supervisor Mode
#define MABT           0x17 // Abort Mode
#define MUND           0x1B // Undefined Mode
#define MSYS           0x1F // System Mode
#define MMSK           0x1F // Mask Mode

#define CEQ            0 // Равно: Z == 1
#define CNE            1 // Не равно: Z == 0
#define CCS            2 // Перенос: C == 1
#define CHS            2 // Беззнак больше или равно: C == 1
#define CCC            3 // Нет переноса: C == 0
#define CLO            3 // Беззнаковое меньше: C == 0
#define CMI            4 // Минус/отрицательное: N == 1
#define CPL            5 // Плюс/положительное или нуль: N == 0
#define CVS            6 // Переполнение: V == 1
#define CVC            7 // Нет переполнения: V == 0
#define CHI            8 // Беззнаковое больше: C == 1 && Z == 0
#define CLS            9 // Беззнаковое меньше или равно: C == 0 && Z == 1
#define CGE           10 // Больше или равно, со знаком: N == V
#define CLT           11 // Меньше чем, со знаком: N != V
#define CGT           12 // Больше чем, со знаком: Z == 0 && N == V
#define CLE           13 // Меньше или равно, со знаком: Z == 1 && N != V
#define CAL           14 // Безусловное выполнение
#define CMSK          15 // Маска условий


// LDR / STR
#define IARM_IS_LDR(i)  \
  ( I32_FIELD_FAST(i,26,3)==1 && INS_BIT(i,22)==0 && INS_BIT(i,20)==1 )
#define IARM_IS_STR(i)  \
  ( I32_FIELD_FAST(i,26,3)==1 && INS_BIT(i,22)==0 && INS_BIT(i,20)==0 )

#define IARM_LDR_I(i)       INS_BIT(i,25)
#define IARM_LDR_P(i)       INS_BIT(i,24)
#define IARM_LDR_U(i)       INS_BIT(i,23)
#define IARM_LDR_W(i)       INS_BIT(i,21)



// if Load and Store word or unsigned byte instructions
#define IARM_IS_LDRHS(i)    ( (i >> 25)&7 == 0 && (i >> 7)&1 == 1 && (i >> 4)&1 == 1 )
#define IARM_LDRHS_P(i)     INS_BIT(i,24)
#define IARM_LDRHS_U(i)     INS_BIT(i,23)
#define IARM_LDRHS_I(i)     INS_BIT(i,22) 
#define IARM_LDRHS_W(i)     INS_BIT(i,21)
#define IARM_LDRHS_L(i)     INS_BIT(i,20)
#define IARM_LDRHS_S(i)     INS_BIT(i, 6)
#define IARM_LDRHS_H(i)     INS_BIT(i, 5)

/* THUMBs command detector Load / Store */

// PC-relative load
#define ITHUMB_LS_PCREL(i)                (((i >> 11)  &   0x1F) == 0x09)
#define ITHUMB_LS_PCREL_Rd(i)             ((i >> 8)    &   0x07)
#define ITHUMB_LS_PCREL_Offset(i)         (i & 0xF)

// load/store with register offset
#define ITHUMB_LS_WITHREGOFFSET(i)        (((i >> 9)  &(~0x06)) == 0x28)
#define ITHUMB_LS_WITHREGOFFSET_Ro(i)     ((i >> 6)   &   0x07)
#define ITHUMB_LS_WITHREGOFFSET_Rb(i)     ((i >> 3)   &   0x07)
#define ITHUMB_LS_WITHREGOFFSET_Rd(i)     ((i >> 0)   &   0x07)
#define ITHUMB_LS_WITHREGOFFSET_L(i)      ((i >> 11)  &   0x01)
#define ITHUMB_LS_WITHREGOFFSET_B(i)      ((i >> 10)  &   0x01)

// load/store sign-extended byte/halfword
#define ITHUMB_LS_SIGNEXTBYTEHWRD(i)      (((i >> 9)  &(~0x06)) == 0x29)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_Ro(i)   ((i >> 6)   &   0x07)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_Rb(i)   ((i >> 3)   &   0x07)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_Rd(i)   ((i >> 0)   &   0x07)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_H(i)    ((i >> 11)  &   0x01)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_S(i)    ((i >> 10)  &   0x01)

// load/store with immediate offset
#define ITHUMB_LS_WITHIMMOFFSET(i)        (((i >> 11)  &(~0x03)) == 0x0C)
#define ITHUMB_LS_WITHIMMOFFSET_L(i)      ((i >> 11)  &   0x01)
#define ITHUMB_LS_WITHIMMOFFSET_B(i)      ((i >> 12)  &   0x01)
#define ITHUMB_LS_WITHIMMOFFSET_Rb(i)     ((i >> 3)   &   0x07)
#define ITHUMB_LS_WITHIMMOFFSET_Rd(i)     ((i >> 0)     &   0x07)
#define ITHUMB_LS_WITHIMMOFFSET_Offset(i) ((i >> 6)     &   0x1F)

// load/store halfword
#define ITHUMB_LS_HWRD(i)                 (((i >> 11)   &  (~0x01)) == 0x10)
#define ITHUMB_LS_HWRD_L(i)               ((i >> 11)    &   0x01)
#define ITHUMB_LS_HWRD_Rb(i)              ((i >> 3)     &   0x07)
#define ITHUMB_LS_HWRD_Rd(i)              ((i >> 0)     &   0x07)
#define ITHUMB_LS_HWRD_Offset(i)          ((i >> 6)     &   0x1F)

// SP-relative load/store
#define ITHUMB_LS_SPREL(i)                (((i >> 12)  &   0x0F) == 0x09)
#define ITHUMB_LS_SPREL_L(i)              ((i >> 11)    &   0x01)
#define ITHUMB_LS_SPREL_Rd(i)             ((i >> 8)    &   0x07)
#define ITHUMB_LS_SPREL_Offset(i)         (i & 0xF)

#endif // __ARM_DEFS_H__


sniffer.h
#ifndef __SNIFFER_H__
#define __SNIFFER_H__

#include "arm_defs.h" 

extern  void da_handler();

#define IO_ADDRESS                    0xF0000000
#define IO_ADDRESS_MIRROR             0xE0000000
#define IO_ADDRESS_DIF                0x10000000

#define VECTOR_DATAABORT_JUMPER       0xE59FF018
#define VECTOR_DATAABORT_JUMPER_OFS   0x10
#define VECTOR_DATAABORT_HANDLER_OFS  0x30

#define MMU_ATTR                      0xC12
#define MMU_TABLE                     0x00090000
#define MMU_GRID(a)                   * ( (unsigned int   *) ( (MMU_TABLE + ((a >> 20) & 0xFFF) * 4) ) )  
#define MMU_GRID_MIRROR(a)            MMU_GRID(a - IO_ADDRESS_DIF)
#define MMU_GRID_SETATTR(a)           ((a & 0xFFF00000) | MMU_ATTR)

typedef struct 
{
  unsigned int r0;
  unsigned int r1;
  unsigned int r2;
  unsigned int r3;
  unsigned int r4;
  unsigned int r5;
  unsigned int r6;
  unsigned int r7;
  unsigned int r8;
  unsigned int r9;
  unsigned int r10;
  unsigned int r11;
  unsigned int r12;
  unsigned int sp;
  unsigned int lr;
  unsigned int pc;
  unsigned int cpsr;
}REGISTERS;

typedef struct 
{
  union regs 
    {
     unsigned int a[MAX_REGS];
     REGISTERS    s;
    };
}CONTEXT;

void  io_sniffer_init(void (*sniff_prc)(unsigned int address, unsigned int value, unsigned int pc, char is_ldr));
void  io_sniffer_deinit();
int   io_sniffer_add(unsigned int io_address);
int   io_sniffer_remove(unsigned int io_address);

#endif // __SNIFFER_H__


system.h
#ifndef __SYSTEM_H__
#define __SYSTEM_H__

__arm void SetDomainAccess(unsigned int domains);
__arm void SetMemoryAccess(unsigned int domains);
__arm void UnlockAllMemoryAccess();
__arm void DisableInterrupt();
__arm void EnableInterrupt();
__arm void EnableModeForOSWork();
__arm void DisableModeForOSWork();

#endif // __SYSTEM_H__


da_handler.asm
#include "arm_defs.h" 
                                      
                                            EXTERN context
                                            EXTERN abt_stack
                                            EXTERN emualate_ldr_str

                                            CODE32
                                            
                                            ARM


                                            RSEG    CODE:CODE
                                            
                                            
                                            PUBLIC  da_handler
                                            
                               da_handler:         
                                  
                                            // Сохраняем контекст R0 - R12 прерванной программы
                                            LDR     SP, =context
                                            STMIA   SP, {R0-R12}
                                  
                                            // Подготавливаем стек для хендера
                                            LDR     SP, =abt_stack
                                            ADD     SP, SP, #0x4000
                                            
                                            
                                            // Сохраняем CPSR прерванной программы
                                            MRS     R1, SPSR
                                            LDR     R0, =context
                                            STR     R1, [R0, #_CPSR*4]
                                            
                                            // Сохраняем PC прерванной программы
                                            SUB     LR, LR, #0x08
                                            STR     LR, [R0, #_PC*4]
                                            
                                            // Берём режим процессора прерванной программы
                                            AND     R2, R1, #MMSK
                                            CMP     R2, #MUSR
                                            // Если режим USR, то возьмём SYS
                                            MOVEQ   R2, #MSYS
                                            
                                            // Включаем режим прерванной программы
                                            MRS     R1, CPSR
                                            BIC     R1, R1, #MMSK
                                            ORR     R1, R1, R2
                                            MSR     CPSR_c, R1
                                            
                                            // Сохраняем SP и LR прерванной программы
                                            STR     SP, [R0, #_SP*4]
                                            STR     LR, [R0, #_LR*4]
                                            
                                            // Контекст полностью сохранён, 
                                            // переводим обратно в режим ABT
                                            BIC     R1, R1, #MMSK
                                            ORR     R1, R1, #MABT
                                            MSR     CPSR_c, R1
                                            
                                            BL      emualate_ldr_str
                                            
                                            // Загружаем CPSR прерванной программы
                                            LDR     R0, =context
                                            LDR     R1, [R0, #_CPSR*4]
                                            MSR     SPSR_cxsf, R1
                                            
                                            // Берём режим процессора прерванной программы
                                            AND     R2, R1, #MMSK
                                            CMP     R2, #MUSR
                                            // Если режим USR, то возьмём SYS
                                            MOVEQ   R2, #MSYS
                                            
                                            // Включаем режим прерванной программы
                                            MRS     R1, CPSR
                                            BIC     R1, R1, #MMSK
                                            ORR     R1, R1, R2
                                            MSR     CPSR_c, R1
                                            
                                            // Загружаем SP и LR прерванной программы
                                            LDR     SP, [R0, #_SP*4]
                                            LDR     LR, [R0, #_LR*4]
                                            
                                            // Включаем снова режим ABT
                                            BIC     R1, R1, #MMSK
                                            ORR     R1, R1, #MABT
                                            MSR     CPSR_c, R1
                                            
                                            // Загружаем PC
                                            LDR     SP, =context
                                            LDR     LR, [SP, #_PC*4]
                                            
                                            // Загружаем регистры R0-R12
                                            LDMIA   SP, {R0-R12}
                                            
                                            // Переходим к следующей инструкции
                                            // Восстанавливаем состояние флагов
                                            MOVS    PC, LR
                                          
                                            
                                            END



sniffer.c
#include "sniffer.h"
#include "system.h"

CONTEXT context;
unsigned char abt_stack[0x4000];
unsigned char sniffer_map[0x100];

unsigned int  da_jumper    = 0;
unsigned int  da_address   = 0;

void (*sniff_p)(unsigned int address, unsigned int value, unsigned int pc, char is_ldr) = 0;


__arm void sniff_proc(unsigned int address, unsigned int value, unsigned int pc, char is_ldr) 
{
  if (sniff_p)
    sniff_p(address, value, pc, is_ldr);
}


__arm int emualate_ldr_str_sub(CONTEXT *context)
{ 
    unsigned int  cpsr;
    unsigned int  instruction;
    unsigned int  address;
 
    //unsigned char cond;
 
    char i, l, b, h, w, s, u, p;
    char rn, rd, rm;
 
    cpsr = context->s.cpsr;
    
    // ARM
    if (!GET_PSR_T(cpsr))
    {
      // Получаем инструкцию
      instruction = WORD(context->s.pc);
    
      // Берём условие
      //cond = IARM_COND(instruction);
   
      // Чтение (LDR)
      if (IARM_IS_LDR(instruction))
      {
        p = IARM_LDR_P(instruction);
        i = IARM_LDR_I(instruction);
        u = IARM_LDR_U(instruction);
        w = IARM_LDR_W(instruction);
     
        rn = IARM_Rn(instruction);
        rd = IARM_Rd(instruction);
        rm = IARM_Rm(instruction);
     
        int sign;
        unsigned int index;
       
        // Используем непосредственное значение для вычисления адреса
        if (!i)
          index = IARM_Imm12(instruction);
        // Используем значение из регистра для вычисления адреса
        else 
        {
          // Смещение от регистра
          if (!IARM_ShiftImm(instruction) && !IARM_Shift(instruction))
            index = context->a[rm];
          // Смещение от регистра со сдвигом
          else
          {
            // Значение для сдвига
            unsigned short si = IARM_ShiftImm(instruction);
            // Тип сдвига
            unsigned short st = IARM_Shift(instruction);
          
            switch(st)
            {
              case IARM_Shift_LSL:
                index = context->a[rm] << si;
                break;
              case IARM_Shift_LSR:
                if (si) 
                {
                  index = 0;
                  break;
                } else
                {
                  index = context->a[rm] >> si;
                  break;
                }
            }
         }
      }
      
      // Значит будем добавлять
      if (u) sign = 1;
      // Значит будем отнимать
      else   sign = -1;

      // Используем пост-индексацию 
      if (!p)
      {
        address =  context->a[rn];
        context->a[rn] = address + index*sign;
        context->a[rd] = WORD(address - IO_ADDRESS_DIF);
        
        // Передадим данные об операции
        sniff_proc(address, context->a[rd], context->s.pc, 1);
      } else
      {
        // Используем пред-индексацию 
        if (w)
        {
          address         =   context->a[rn] + index*sign;
          context->a[rn]  =   address;
          context->a[rd]  =   WORD(address - IO_ADDRESS_DIF);
          
          // Передадим данные об операции
          sniff_proc(address, context->a[rd], context->s.pc, 1);
         } 
          // Не используем пост/пред-индексацию 
         else
         {  
            address         =   context->a[rn] + index*sign;
            context->a[rd]  =   WORD(address - IO_ADDRESS_DIF);
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 1);
         }
      }
    } 
    // Запись (STR)
    else if (IARM_IS_STR(instruction))
    {
      p = IARM_LDR_P(instruction);
      i = IARM_LDR_I(instruction);
      u = IARM_LDR_U(instruction);
      w = IARM_LDR_W(instruction);
     
      rn = IARM_Rn(instruction);
      rd = IARM_Rd(instruction);
      rm = IARM_Rm(instruction);
     
      int sign;
      unsigned int index;
    
      // Используем непосредственное значение для вычисления адреса
      if (!i) index = IARM_Imm12(instruction);
      // Используем значение из регистра для вычисления адреса
      else 
      {
        // Смещение от регистра
        if (!IARM_ShiftImm(instruction) && !IARM_Shift(instruction)) index = context->a[rm];
        // Смещение от регистра со сдвигом
        else
        {
            // Значение для сдвига
            unsigned short si = IARM_ShiftImm(instruction);
            // Тип сдвига
            unsigned short st = IARM_Shift(instruction);
          
            switch(st)
            {
              case IARM_Shift_LSL:
                index = context->a[rm] << si;
                break;
              case IARM_Shift_LSR:
                if (si) 
                {
                  index = 0;
                  break;
                } else
                {
                  index = context->a[rm] >> si;
                 break;
                }
            }
        }
      }
      
      // Значит будем добавлять
      if (u) sign = 1;
      // Значит будем отнимать
      else   sign = -1;

      // Используем пост-индексацию 
      if (!p)
      {
        address                         = context->a[rn];
        context->a[rn]                  = address + index*sign; 
        WORD(address - IO_ADDRESS_DIF)  = context->a[rd];
        
        // Передадим данные об операции
        sniff_proc(address, context->a[rd], context->s.pc, 0);
      } else
      {
        // Используем пред-индексацию 
        if (w)
        {
          address                         = context->a[rn] + index*sign;
          context->a[rn]                  = address;  
          WORD(address - IO_ADDRESS_DIF)  = context->a[rd];
          
          // Передадим данные об операции
          sniff_proc(address, context->a[rd], context->s.pc, 0);
        } 
        // Не используем пост/пред-индексацию 
        else
        {  
          address                         = context->a[rn] + index*sign;;
          WORD(address - IO_ADDRESS_DIF)  = context->a[rd];
          
          // Передадим данные об операции
          sniff_proc(address, context->a[rd], context->s.pc, 0);
        }
      }  
    }
   
    context->s.pc += 4;
    return 1;
  } else 
  // THUMB
  {
    // Получаем инструкцию
    instruction   = HWRD(context->s.pc);
      
    if (ITHUMB_LS_WITHREGOFFSET(instruction))
    {
        rd              =   ITHUMB_LS_WITHREGOFFSET_Rd(instruction);
        
        l               =   ITHUMB_LS_WITHREGOFFSET_L(instruction);
        b               =   ITHUMB_LS_WITHREGOFFSET_B(instruction);
            
        // Чтение
        if (l)
        {
            // Считывание байта
            if (b)
            context->a[rd]  =   BYTE(address - IO_ADDRESS_DIF);
            else
            // Считывание слова
            context->a[rd]  =   WORD(address - IO_ADDRESS_DIF);
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 1);
        }
        // Запись   
        else
        {
            // Запись байта
            if (b)
            BYTE(address - IO_ADDRESS_DIF)   =  context->a[rd];
            else
            // Запись слова
            WORD(address - IO_ADDRESS_DIF)   =  context->a[rd];
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 0);
        }
        
    } else  if (ITHUMB_LS_SIGNEXTBYTEHWRD(instruction))
    {
        
        address         =   context->a[ITHUMB_LS_SIGNEXTBYTEHWRD_Rb(instruction)] + context->a[ITHUMB_LS_SIGNEXTBYTEHWRD_Ro(instruction)];
        rd              =   ITHUMB_LS_SIGNEXTBYTEHWRD_Rd(instruction);
        
        h               =   ITHUMB_LS_SIGNEXTBYTEHWRD_H(instruction);
        s               =   ITHUMB_LS_SIGNEXTBYTEHWRD_S(instruction);
            
        // Запись полуслова
        if (!h && !s)
        {
            HWRD(address - IO_ADDRESS_DIF)   =  context->a[rd];
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 0);
        //Чтение полуслова
        } else if (h && !s)
        {
            context->a[rd]               =   HWRD(address - IO_ADDRESS_DIF);
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 1);
        // Чтение байта с расширенным знаком
        } else if (!h && s)
        {
            context->a[rd]               =   BYTE(address - IO_ADDRESS_DIF); 
            if (INS_BIT(context->a[rd], 7))
              context->a[rd] |= 0xFFFFFF00;
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 1);
        // Чтение полуслова с расширенным знаком
        } else if (h && s)
        {
            context->a[rd]               =   HWRD(address - IO_ADDRESS_DIF);  
            if (INS_BIT(context->a[rd], 15))
              context->a[rd] |= 0xFFFF0000;
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 1);
        }
        
    } else  if (ITHUMB_LS_WITHIMMOFFSET(instruction))
    {
        rd              =   ITHUMB_LS_WITHIMMOFFSET_Rd(instruction);
        
        l               =   ITHUMB_LS_WITHIMMOFFSET_L(instruction);
        b               =   ITHUMB_LS_WITHIMMOFFSET_B(instruction);
         
        if (b)
        address        =   context->a[ITHUMB_LS_WITHIMMOFFSET_Rb(instruction)] + ITHUMB_LS_WITHIMMOFFSET_Offset(instruction);
        else
        address        =   context->a[ITHUMB_LS_WITHIMMOFFSET_Rb(instruction)] + (ITHUMB_LS_WITHIMMOFFSET_Offset(instruction) << 2);
       
        // Чтение
        if (l)
        {
            // Считывание байта
            if (b)
            context->a[rd]  =   BYTE(address - IO_ADDRESS_DIF);
            else
            // Считывание слова
            context->a[rd]  =   WORD(address - IO_ADDRESS_DIF);
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 1);
        }
        // Запись   
        else
        {
            // Запись байта
            if (b)
            BYTE(address - IO_ADDRESS_DIF)   =  context->a[rd];
            else
            // Запись слова
            WORD(address - IO_ADDRESS_DIF)   =  context->a[rd];
            
            // Передадим данные об операции
            sniff_proc(address, context->a[rd], context->s.pc, 0);
        }
        
    } else  if (ITHUMB_LS_HWRD(instruction))
    {
        rd              =   ITHUMB_LS_HWRD_Rd(instruction);
        l               =   ITHUMB_LS_HWRD_L(instruction);
        address         =   context->a[ITHUMB_LS_HWRD_Rb(instruction)] + (ITHUMB_LS_HWRD_Offset(instruction) << 1);
        
        // Чтение
        if (l)
            context->a[rd]  =   HWRD(address - IO_ADDRESS_DIF);
        // Запись   
        else
            HWRD(address - IO_ADDRESS_DIF)   =  context->a[rd];
        
        // Передадим данные об операции
        sniff_proc(address, context->a[rd], context->s.pc, l);
    } else  if (ITHUMB_LS_SPREL(instruction))
    {
        address         =   context->s.sp + (ITHUMB_LS_SPREL_Offset(instruction) << 2);
        rd              =   ITHUMB_LS_SPREL_Rd(instruction);
        l               =   ITHUMB_LS_SPREL_L(instruction);
          
        // Чтение
        if (l)
          context->a[rd]  =   WORD(address - IO_ADDRESS_DIF);
        else
        // Запись  
          WORD(address - IO_ADDRESS_DIF)   =  context->a[rd];
        
        // Передадим данные об операции
        sniff_proc(address, context->a[rd], context->s.pc, l);
    }
     
    context->s.pc   +=  2;
    return 1;
  }  
}

__arm void emualate_ldr_str(CONTEXT *context)
{
  SetDomainAccess(0xFFFFFFFF);
  emualate_ldr_str_sub(context);
  SetDomainAccess(1);
}

void io_sniffer_init(void (*sniff_prc)(unsigned int address, unsigned int value, unsigned int pc, char is_ldr))
{
  if (sniff_prc)
  {
    UnlockAllMemoryAccess();
  
    da_jumper       =  WORD(VECTOR_DATAABORT_JUMPER_OFS);
    da_address      =  WORD(VECTOR_DATAABORT_HANDLER_OFS);
  
    WORD(VECTOR_DATAABORT_JUMPER_OFS)   =  VECTOR_DATAABORT_JUMPER;
    WORD(VECTOR_DATAABORT_HANDLER_OFS)  =  (int)&da_handler;
  
    SetMemoryAccess(1);
  
    sniff_p         =   sniff_prc;
    
    for (int i = 0; i < 0x100; i++)
      sniffer_map[i] = 0;
  }
}


void io_sniffer_deinit()
{
  UnlockAllMemoryAccess();
  
  da_jumper     =  WORD(VECTOR_DATAABORT_JUMPER_OFS);
  da_address    =  WORD(VECTOR_DATAABORT_HANDLER_OFS);
  
  WORD(VECTOR_DATAABORT_JUMPER_OFS)   =  (unsigned int)&da_jumper;
  WORD(VECTOR_DATAABORT_HANDLER_OFS)  =  (unsigned int)&da_address;
  
  for (int i = 0; i < 0x100; i++)
  {
    if (sniffer_map[i])
    {
      unsigned int io_address       = IO_ADDRESS | (i << 20) | MMU_ATTR;
      MMU_GRID(io_address)          = MMU_GRID_SETATTR(io_address);
      MMU_GRID_MIRROR(io_address)   = 0x00000000; 
    }
    
    sniffer_map[i] = 0;
  }
  
  SetMemoryAccess(1);
  
  sniff_p       =   0;
}

int io_sniffer_add(unsigned int io_address)
{
  if ((io_address >> 28) == 0x0F)
  {
    unsigned char sm    =  (io_address >> 20) & 0x0FF;
    if (!sniffer_map[sm])
    {
      UnlockAllMemoryAccess();
      
      MMU_GRID(io_address)          = 0x00000000;
      MMU_GRID_MIRROR(io_address)   = MMU_GRID_SETATTR(io_address);
      
      SetMemoryAccess(1);
      
      sniffer_map[sm] = 1;
      return 1;
    }
  }
  
  return 0;
}

int io_sniffer_remove(unsigned int io_address)
{
  if ((io_address >> 28) == 0x0F)
  {
    unsigned char sm =  (io_address >> 20) & 0x0FF;
    if (sniffer_map[sm])
    {
      UnlockAllMemoryAccess();
      
      MMU_GRID(io_address)          = MMU_GRID_SETATTR(io_address);
      MMU_GRID_MIRROR(io_address)   = 0x00000000;
      
      SetMemoryAccess(1);
      
      sniffer_map[sm] = 0;
      return 1;
    }
  }
  
  return 0;
}


system.c
#include "system.h"
#include "intrinsics.h"

#pragma swi_number=0x00
__swi __arm void system_mode_sg();

#pragma swi_number=0x04
__swi __arm void system_mode_nsg();

#pragma swi_number=0x81B5
__swi __arm int is_nsg();


__arm void SetDomainAccess(unsigned int domains)
{
 __MCR(15, 0, domains, 3, 0, 0);
   for (int i = 0; i < 20; i++);
}

__arm void SetMemoryAccess(unsigned int domains)
{
 if (is_nsg()) system_mode_nsg();
   else system_mode_sg();
 
 __disable_interrupt();
   SetDomainAccess(domains);
 __enable_interrupt();
}

__arm void UnlockAllMemoryAccess()
{
 if (is_nsg()) system_mode_nsg();
   else system_mode_sg();
 
 __disable_interrupt();
   SetDomainAccess(0xFFFFFFFF);
 __enable_interrupt();
}

__arm void DisableInterrupt()
{
 if (is_nsg()) system_mode_nsg();
   else system_mode_sg();
 __disable_interrupt();
}

__arm void EnableInterrupt()
{
 if (is_nsg()) system_mode_nsg();
   else system_mode_sg();
 __enable_interrupt();
}

unsigned long cpsr = 0;

__arm void EnableModeForOSWork()
{
  cpsr = __get_CPSR();
  cpsr &= 0xC0;
  cpsr |= 0x1F;
  __set_CPSR(cpsr);
}

__arm void DisableModeForOSWork()
{
  if (cpsr)
  __set_CPSR(cpsr);
  cpsr = 0;
}


Результат


Ну и напоследок расскажу, что же в итоге получилось добиться, используя этот сниффер.
На телефон скидывается исполняемый файл io_sniffer.elf, запускается.
Настроим сниффер так, чтобы он отлавливал операции с интерфейсом I2C (0xF4800000).
Помимо обработчика, есть специальный таск (тред, поток), который в режиме реального времени передаёт всё в компьютер через кабель, а там стоит программа, принимающая данные и выводящая их в окно.
Если нажать на кнопку телефона, то его динамик издаст щелчок (включается в настройках телефона), это порождение устройства Dialog, который обменивается по шине I2C с микроконтроллером. И по идее, мы должны увидеть, что прошивка такого делает,
что это устройство так синтезирует звук:

I2C: щелчок клавиши
0xA07EE064|I2C    |CLC      |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C    |BUSCON   |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C    |SYSCON   |0xF4800010|Запись|0x00880000|
0xA089550C|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C    |ICR      |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C    |RTB      |0xF4800018|Запись|0x00001262|
0xA0895940|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C    |SYSCON   |0xF4800010|Запись|0x04880000|
0xA0895964|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C    |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C    |SYSCON   |0xF4800010|Запись|0x00980230|
0xA0895444|I2C    |RTB      |0xF4800018|Запись|0x00000010|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C    |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C    |SYSCON   |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C    |BUSCON   |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C    |CLC      |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C    |CLC      |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C    |BUSCON   |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C    |SYSCON   |0xF4800010|Запись|0x00880000|
0xA089550C|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C    |ICR      |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C    |RTB      |0xF4800018|Запись|0x00001362|
0xA0895940|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C    |SYSCON   |0xF4800010|Запись|0x04880000|
0xA0895964|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C    |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C    |SYSCON   |0xF4800010|Запись|0x00980230|
0xA0895444|I2C    |RTB      |0xF4800018|Запись|0x00000010|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C    |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C    |SYSCON   |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C    |BUSCON   |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C    |CLC      |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C    |CLC      |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C    |BUSCON   |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C    |SYSCON   |0xF4800010|Запись|0x00880000|
0xA089550C|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C    |ICR      |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C    |RTB      |0xF4800018|Запись|0x00004462|
0xA0895940|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C    |SYSCON   |0xF4800010|Запись|0x04880000|
0xA0895964|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C    |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C    |SYSCON   |0xF4800010|Запись|0x00980230|
0xA0895444|I2C    |RTB      |0xF4800018|Запись|0x00000062|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C    |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C    |SYSCON   |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C    |BUSCON   |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C    |CLC      |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C    |CLC      |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C    |BUSCON   |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C    |SYSCON   |0xF4800010|Запись|0x00880000|
0xA089550C|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C    |ICR      |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C    |RTB      |0xF4800018|Запись|0x00004662|
0xA0895940|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C    |SYSCON   |0xF4800010|Запись|0x04880000|
0xA0895964|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C    |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C    |SYSCON   |0xF4800010|Запись|0x00980230|
0xA0895444|I2C    |RTB      |0xF4800018|Запись|0x00000067|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C    |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C    |SYSCON   |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C    |BUSCON   |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C    |CLC      |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C    |CLC      |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C    |BUSCON   |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C    |SYSCON   |0xF4800010|Запись|0x00880000|
0xA089550C|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C    |ICR      |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C    |RTB      |0xF4800018|Запись|0x00004262|
0xA0895940|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C    |SYSCON   |0xF4800010|Запись|0x04880000|
0xA0895964|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C    |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C    |SYSCON   |0xF4800010|Запись|0x00980230|
0xA0895444|I2C    |RTB      |0xF4800018|Запись|0x00000008|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C    |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C    |SYSCON   |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C    |BUSCON   |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C    |CLC      |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C    |CLC      |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C    |BUSCON   |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C    |SYSCON   |0xF4800010|Запись|0x00880000|
0xA089550C|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C    |ICR      |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C    |ICR      |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C    |RTB      |0xF4800018|Запись|0x00004462|
0xA0895940|I2C    |SYSCON   |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C    |SYSCON   |0xF4800010|Запись|0x04880000|
0xA0895964|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C    |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C    |SYSCON   |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C    |SYSCON   |0xF4800010|Запись|0x00980230|
0xA0895444|I2C    |RTB      |0xF4800018|Запись|0x00000062|
0xA0895540|I2C    |ICR      |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C    |ICR      |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C    |SYSCON   |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C    |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C    |SYSCON   |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C    |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C    |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C    |ICR      |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C    |BUSCON   |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C    |CLC      |0xF4800000|Запись|0x00000001|


А вот передача 8-байтного файла (содержимое угадайте) habr.txt по ИК-порту
с телефона Siemens CF75 (на нём сниффер) в Siemens CX75.
Отлавливаем только регистры данных:

USART1: ИК передача файла habr.txt
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF C0 FF 3F 01 10 яяяяяяяяяяяАя?..
 64 77 01 FF FF FF FF 01 00 00 06 7C C1 C1       dw.яяяя....|ББ  
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 C1 FF FF FF FF FF FF FF FF FF FF C0 FE BF 01 40 БяяяяяяяяяяАюї.@
 90 81 09 10 64 77 01 01 00 00 B1 24 00 53 49 45 ђЃ..dw....±$.SIE
 4D 45 4E 53 20 43 58 37 35 3E 35 C1             MENS CX75>5Б    
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF C0 FF 3F 01 10 яяяяяяяяяяяАя?..
 64 77 01 FF FF FF FF 01 01 00 DE 65 C1 C1       dw.яяяя...ЮeББ  
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 C1                                              Б               
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF C0 FF 3F 01 10 яяяяяяяяяяяАя?..
 64 77 01 FF FF FF FF 01 02 00 B6 4F C1 C1 FF FF dw.яяяя...¶OББяя
 FF FF FF FF FF FF FF FF FF C0 FF 3F 01 10 64 77 яяяяяяяяяАя?..dw
 01 FF FF FF FF 01 03 00 6E 56 C1 C1 FF FF FF FF .яяяя...nVББяяяя
 FF FF FF FF FF FF FF C0 FF 3F 01 10 64 77 01 FF яяяяяяяАя?..dw.я
 FF FF FF 01 04 00 66 1B C1 C1 FF FF FF FF FF FF яяя...f.ББяяяяяя
 FF FF FF FF FF C0 FF 3F 01 10 64 77 01 FF FF FF яяяяяАя?..dw.яяя
 FF 01 05 00 BE 02 C1 C1 FF FF FF FF FF FF FF FF я...ѕ.ББяяяяяяяя
 FF FF FF C0 FF 3F 01 10 64 77 01 FF FF FF FF 01 яяяАя?..dw.яяяя.
 FF 00 B1 24 00 53 49 45 4D 45 4E 53 20 43 46 37 я.±$.SIEMENS CF7
 35 51 CD C1 C1 FF FF FF FF FF FF FF FF FF FF FF 5QНББяяяяяяяяяяя
 C0 FF 93 10 64 77 01 40 90 81 09 B4 01 01 3E 82 Ая“.dw.@ђЃ.ґ..>‚
 01 07 83 01 0F 84 01 01 85 01 04 86 01 07 08 01 ..ѓ..„..…..†....
 FF 25 82 C1 C1                                  я%‚ББ           
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 C1 FF FF FF FF FF FF FF FF FF FF C0 B4 73 40 90 БяяяяяяяяяяАґs@ђ
 81 09 10 64 77 01 01 01 3E 82 01 07 83 01 0F 84 Ѓ..dw...>‚..ѓ..„
 01 01 85 01 04 86 01 07 08 01 FF 60 18 C1       ..…..†....я`.Б  
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 JББББББББББББББ
 C1 C1                                           ББ              
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 11 41 яяяяяяяяяяяяАґ.A
 53 C1                                           SБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 10 яяяяяяяяяяяяяАµ.
 80 02 01 00 34 14 C1 C1                         Ђ...4.ББ        
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 31 43 яяяяяяяяяяяяАґ1C
 72 C1                                           rБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 30 82 яяяяяяяяяяяяАґ0‚
 00 81 00 8C 70 C1                               .Ѓ.ЊpБ          
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 32 яяяяяяяяяяяяяАµ2
 00 02 84 04 4F 42 45 58 13 49 72 44 41 3A 54 69 ..„.OBEX.IrDA:Ti
 6E 79 54 50 3A 4C 73 61 70 53 65 6C 04 AF C1 C1 nyTP:LsapSel.ЇББ
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 31 яяяяяяяяяяяяяАµ1
 9B 6B C1 C1                                     ›kББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 52 02 яяяяяяяяяяяяАґR.
 00 84 00 00 01 00 02 01 00 00 00 04 8D AF C1    .„..........ЌЇБ 
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 54 яяяяяяяяяяяяяАµT
 84 04 01 00 04 18 B5 C1 C1                      „.....µББ       
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 51 яяяяяяяяяяяяяАµQ
 9D 08 C1 C1                                     ќ.ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 74 84 яяяяяяяяяяяяАґt„
 04 81 00 04 41 A3 C1                            .Ѓ..AЈБ         
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1                                     џ)ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1                                     џ)ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1 C1                                  џ)БББ           
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 џ)ББББББББББББББ
 C1 C1                                           ББ              
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1 C1                                  џ)БББ           
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1                                     џ)ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1                                     џ)ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1       џ)ББББББББББББ  
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1                                     џ)ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1                                     џ)ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
 30 C1                                           0Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 76 яяяяяяяяяяяяяАµv
 04 04 00 80 00 07 10 00 02 0B 92 AC C1 C1       ...Ђ......’¬ББ  
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 91 49 яяяяяяяяяяяяАґ‘I
 D7 C1                                           ЧБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
 9F 29 C1 C1                                     џ)ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 96 04 яяяяяяяяяяяяАґ–.
 04 01 A0 00 07 10 00 02 0B 6F 76 C1             .. ......ovБ    
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 98 яяяяяяяяяяяяяАµ˜
 04 04 01 02 00 1D 01 00 15 00 68 00 61 00 62 00 ..........h.a.b.
 72 00 2E 00 74 00 78 00 74 00 00 C3 00 00 00 08 r...t.x.t..Г....
 8C 02 C1 C1                                     Њ.ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 B1 4B яяяяяяяяяяяяАґ±K
 F6 C1                                           цБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 91 яяяяяяяяяяяяяАµ‘
 91 CE C1 C1                                     ‘ОББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 B8 04 яяяяяяяяяяяяАґё.
 04 01 90 00 03 99 A7 C1                         ..ђ..§Б        
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 BA яяяяяяяяяяяяяАµє
 04 04 01 02 00 0E 48 00 0B 48 41 42 52 48 41 42 ......H..HABRHAB
 52 96 88 C1 C1                                  R–€ББ           
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
 95 C1                                           •Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
 93 EF C1 C1                                     “пББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
 95 C1                                           •Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
 93 EF C1 C1                                     “пББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
 95 C1                                           •Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
 93 EF C1 C1                                     “пББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
 95 C1                                           •Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
 93 EF C1 C1                                     “пББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
 95 C1                                           •Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
 93 EF C1 C1                                     “пББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
 95 C1                                           •Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
 93 EF C1 C1                                     “пББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
 95 C1                                           •Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
 93 EF C1 C1                                     “пББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 DA 04 яяяяяяяяяяяяАґЪ.
 04 01 90 00 03 A7 34 C1                         ..ђ..§4Б        
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 DC яяяяяяяяяяяяяАµЬ
 04 04 01 82 00 06 49 00 03 DD A5 C1 C1          ...‚..I..ЭҐББ   
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 F1 4F яяяяяяяяяяяяАґсO
 B4 C1                                           ґБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 D1 яяяяяяяяяяяяяАµС
 95 8C C1 C1                                     •ЊББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 FC 04 яяяяяяяяяяяяАґь.
 04 01 A0 00 03 47 89 C1                         .. ..G‰Б        
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 FE яяяяяяяяяяяяяАµю
 04 04 01 81 00 03 A4 66 C1 C1                   ...Ѓ..¤fББ      
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 11 41 яяяяяяяяяяяяАґ.A
 53 C1                                           SБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 F1 яяяяяяяяяяяяяАµс
 97 AD C1 C1                                     —­ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 1E 04 яяяяяяяяяяяяАґ..
 04 01 A0 00 03 64 9C C1                         .. ..dњБ        
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 11 41 яяяяяяяяяяяяАґ.A
 53 C1                                           SБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 11 41 яяяяяяяяяяяяАґ.A
 53 C1                                           SБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 10 яяяяяяяяяяяяяАµ.
 84 04 02 01 E0 8B C1 C1                         „...а‹ББ        
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 31 43 яяяяяяяяяяяяАґ1C
 72 C1                                           rБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 31 43 яяяяяяяяяяяяАґ1C
 72 C1                                           rБ              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 12 яяяяяяяяяяяяяАµ.
 80 02 02 01 5D 39 C1 C1                         Ђ...]9ББ        
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1 C1                                  JБББ           
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
 99 4A C1 C1                                     JББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
 11 C1                                           .Б              
0xA0A3F3B0|USART1 |TXB      |0xF1800020|Запись|
 FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 53 яяяяяяяяяяяяяАµS
 8F 2B C1 C1                                     Џ+ББ            
0xA07F1BC0|USART1 |RXB      |0xF1800024|Чтение|
 FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 73 40 яяяяяяяяяяяяАґs@
 90 81 09 10 64 77 01 3C 38 C1                   ђЃ..dw.<8Б      


Вернёмся опять к I2C. Поставим фильтр так, чтобы отслеживалась только передача данных.
При щелчках, сервисных звуках, изменении подсветки, громкости и вибрации, мы увидим что что-то происходит:



Файлы


IOSniffer_CPPBuilder_XE5.rar
IOSniffer_IAR42.rar
IOSniffer_I2C.avi
Теги:
Хабы:
+33
Комментарии8

Публикации

Истории

Работа

Программист С
49 вакансий

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн