Перейти к содержанию
    

Драйвер экрана для EmWin

2 minutes ago, Darth Vader said:

Тогда можно определить функцию-пустышку. Чтобы все скомпилировалось и собралось.

Оно и так "скомпилируется и соберется". Только работать не будет не на STM.

 

4 minutes ago, Darth Vader said:

Вообще же подход странный: инициализация внутренних потрохов МК должна быть выполнена ДО начала работы с дисплеем. Зачем нужна настройка тактирования внутренностей МК в процессе работы - за гранью моего понимания.

Где же она в процессе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, aaarrr said:

Где же она в процессе?

Из фразы "без этого библиотека не работает" я понял, что какая-то библиотечная функция вызывает её (функцию SPL, включающую тактирование шины).

Если это не так, и всё собирается без этого - хорошо.

Значит надо переписать функции выдачи команд/данных на дисплей под конкретный МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая-то библиотечная функция проверяет наличие аппаратного модуля CRC, тактирование которого предварительно надо самостоятельно включить в RCC. Если модуля нет, то STemWin просто не будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, aaarrr сказал:

Какая-то библиотечная функция проверяет наличие аппаратного модуля CRC, тактирование которого предварительно надо самостоятельно включить в RCC. Если модуля нет, то STemWin просто не будет работать.

Можно сделать его программную эмуляцию. Если имеется MPU.  :yes3:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

Можно сделать его программную эмуляцию. Если имеется MPU.  :yes3:

Если бы я делал подобную защиту, то непременно предусмотрел бы такой вариант.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Можно сделать его программную эмуляцию. Если имеется MPU

Это как? Само устройство эмулировать?, и каким образом здесь MPU? На сколь помню - это просто защитный механизм от доступа по заблокированным адресам...

2 часа назад, aaarrr сказал:

Какая-то библиотечная функция проверяет наличие аппаратного модуля CRC

Остается только найти какая и реверсить... ИМХО по-моему проще граф. движок свой написать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, mantech said:

На сколь помню - это просто защитный механизм от доступа по заблокированным адресам...

Испокон веков подобные механизмы можно было использовать для реализации виртуальной памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, mantech сказал:

Это как? Само устройство эмулировать?, и каким образом здесь MPU? На сколь помню - это просто защитный механизм от доступа по заблокированным адресам...

Ну вот и поставить эту защиту на диапазон адресов регистров CRC-вычислителя. На чтение и запись.

А в ISR fault-а MPU смотреть - какая команда вызвала fault? Если запись - что писала? В соответствии с записанным изменять режим вычисления CRC или производить операцию над данными (исходя из содержимого регистра CPU из которого должна была идти запись).

А на чтение: если чтение регистра данных/результата - возвращать в нужный регистр CPU требуемое значение.

Это если делать полную эмуляцию. Но можно сделать сокращённую эмуляцию - только нужных режимов вычислителя CRC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А потом выяснится, что процедура проверки использует какую-нибудь недокументированную особенность модуля CRC, контролирует время выполнения или еще что-нибудь в этом роде.

Да и вообще, так поступать как минимум нехорошо, а если продукт на продажу, так еще и ст.146 УК РФ (или аналогичная в другой юрисдикции) добавляется :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я думаю, что с CRC модулем STM32 там все хорошо сделано. Про него пишут:
CRC computation done in 4 AHB clock cycles (HCLK)
Запретить прерывания, послать в модуль случайные числа и проверить время выполнения по счётчику DWT никакой сложности не представляет.
Перехватить с помощью MPU и вычислить программно времени не хватит. Так что, только грубый взлом слом, а это некрасиво :dirol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, aaarrr сказал:

А потом выяснится, что процедура проверки использует какую-нибудь недокументированную особенность модуля CRC

Вполне возможно, почему-то выбрали для защиты именно это устройство, плюс стмовцы скорее всего "поделились" более расширенной докой на свое поделье и все в шляпе...

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, Baser сказал:

Я думаю, что с CRC модулем STM32 там все хорошо сделано. Про него пишут:
CRC computation done in 4 AHB clock cycles (HCLK)
Запретить прерывания,

Запрещённые прерывания никак не влияют на генерацию MPU-fault-а. Только запрет fault-ов влияет.

Но у M3/M4 есть привилегированный режим и юзер-режим, и (хотя я не уверен) вроде для юзер-мода можно запретить запрет fault-ов. Исходя из логики такое должно быть, хотя утверждать не буду. И не буду утверждать есть ли всё это в ядре 1986ВЕ9х.

Цитата

послать в модуль случайные числа и проверить время выполнения по счётчику DWT никакой сложности не представляет.

Так же как никакой сложности не представляет закрыть и область DWT тем же самым MPU и точно так же сэмулировать и его.

Цитата

Перехватить с помощью MPU и вычислить программно времени не хватит.

Почему? Откуда программа знает сколько времени занял расчёт, если и источники времени для неё перехвачены и сэмулированы? Да и не делает она этого всё время наверняка, а скорей всего только при старте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, jcxz сказал:

Да и не делает она этого всё время наверняка, а скорей всего только при старте.

Это-то как раз проверить просто - после успешного инита на СТМ отключить все эти генераторы КС и посмотреть, будет виснуть или глючить - значит там проверок дофига, может в каждой более-менее сложной функции...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, jcxz сказал:

Так же как никакой сложности не представляет закрыть и область DWT тем же самым MPU и точно так же сэмулировать и его.

Откуда программа знает сколько времени занял расчёт, если и источники времени для неё перехвачены и сэмулированы?

Возможно вы и правы, и при наличии MPU все это можно сделать. Никогда не применял ни MPU, ни MMU, нет опыта.
Но все это интересно только в академическом смысле, по причинам, озвученным мною ранее (есть пути проще с теми же последствиями и результатом).

 

5 часов назад, mantech сказал:

Это-то как раз проверить просто - после успешного инита на СТМ отключить все эти генераторы КС и посмотреть, будет виснуть или глючить - значит там проверок дофига, может в каждой более-менее сложной функции...

Это действительно попроще :beach:
Если будет время, и не забуду - на неделе попробую. Правда я пока добрался только до запуска демок виджетов от Segger-а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/23/2020 at 3:57 PM, aaarrr said:

Если бы я делал подобную защиту, то непременно предусмотрел бы такой вариант.

Да ладно вам... Ну нельзя сделать такую защиту, чтоб человек, у которого есть полный доступ к процессору и капелька мозгов, не мог сломать. Сеггеры это хорошо понимают и особо не заморачивались.

 

В общем, надоели мне местные теоретики - писатели эмуляторов непонятно чего.

 

Взял с сайта ST бинарник с примером для F103, затолкал в гидру, чуток помедитировал...

        080433dc 37  48           ldr        r0,[FP_CTRL ]                                    = e0002000
        080433de 01  68           ldr        r1,[r0,#0x0 ]=>DAT_e0002000
        080433e0 49  08           lsr        r1,r1,#0x1
        080433e2 49  00           lsl        r1,r1,#0x1
        080433e4 01  60           str        r1,[r0,#0x0 ]=>DAT_e0002000
        080433e6 01  21           mov        r1,#0x1
        080433e8 35  48           ldr        r0,[->Peripherals::CRC ]                         = 40023000
        080433ea 81  60           str        r1,[r0,#offset  CRC.CRC.CR ]                      = null
        080433ec 35  49           ldr        r1,[DWORD_080434c4 ]                             = F407A5C2h
        080433ee 01  60           str        r1,[r0,#0x0 ]=>Peripherals::CRC                  = 
        080433f0 00  68           ldr        r0,[r0,#0x0 ]=>Peripherals::CRC                  = 
        080433f2 35  49           ldr        r1,[DWORD_080434c8 ]                             = B5E8B5CDh
        080433f4 88  42           cmp        r0,r1
        080433f6 00  d0           beq        LAB_080433fa
                             LAB_080433f8                                    XREF[1]:     080433f8 (j)   
        080433f8 fe  e7           b          LAB_080433f8

Собственно, всё. С вероятностью 99% это единственное обращение к модулю во всей программе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...