Jump to content

    

__inline__

Участник
  • Content Count

    867
  • Joined

Everything posted by __inline__


  1. STM342F4 и FSMC

    Использую отладочную плату STM32F4Discovery (контроллер STM32F407) и LCD, подключенный по FSMC (дисплей от телефона Sony Ericsson K800i). Обмен данными с дисплеем идёт нормально до частоты процессора 112 МГц. Стоит поднять частоту до 168 МГц - при записи в видеопамять дисплея возникают сбои: неправильная запись данных или декодирует их как команды (при этом дисплею окончательно сносит крышу). Пробовал выставлять разные Address_Setup, Data_Setup - не помогло. Обнаружил, если снизить частоту тактирования на линию порта GPIO D7 - это !CS LCD до 2 МГц, или подсоединить этот вывод через резистор 820 Ом (с меньшими значениями не игрался), то всё работает корректно. Причём, дисплей заводится на сверх-быстрых времянках! В принципиальной схеме на телефон на каждой линии "дисплей-процессор" стоит конденсатор 33 пФ на землю. Дисплей соединён с отладочной платой "макаронами" длиной 10 см. На шине больше ничего кроме дисплея нет. Какие причины столь странного поведения? От чего без резистора на линии !CS дисплей глючит? Код настройки GPIO и FSMC ниже(работает): void GPIO(void) { GPIO_InitTypeDef gpio; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_ GPIOE,ENABLE); //LCD GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); // D0 GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); // D1 GPIO_PinAFConfig(GPIOD,GPIO_PinSource0 ,GPIO_AF_FSMC); // D2 GPIO_PinAFConfig(GPIOD,GPIO_PinSource1 ,GPIO_AF_FSMC); // D3 GPIO_PinAFConfig(GPIOE,GPIO_PinSource7 ,GPIO_AF_FSMC); // D4 GPIO_PinAFConfig(GPIOE,GPIO_PinSource8 ,GPIO_AF_FSMC); // D5 GPIO_PinAFConfig(GPIOE,GPIO_PinSource9 ,GPIO_AF_FSMC); // D6 GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); // D7 GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); //A16 => RS GPIO_PinAFConfig(GPIOD,GPIO_PinSource7 ,GPIO_AF_FSMC); //NE1 => CS !!! ВОСПРИИМЧИВ К ПОМЕХАМ !!! РЕЗИСТОР ИЛИ ПОНИЗИТЬ ЧАСТОТУ GPIO D7 GPIO_PinAFConfig(GPIOD,GPIO_PinSource4 ,GPIO_AF_FSMC); //NOE => RD GPIO_PinAFConfig(GPIOD,GPIO_PinSource5 ,GPIO_AF_FSMC); //NWE => WR gpio.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_11 |GPIO_Pin_14|GPIO_Pin_15; gpio.GPIO_Mode=GPIO_Mode_AF; gpio.GPIO_Speed=GPIO_Speed_100MHz; gpio.GPIO_OType=GPIO_OType_PP; gpio.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOD,&gpio); gpio.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; gpio.GPIO_Mode=GPIO_Mode_AF; gpio.GPIO_Speed=GPIO_Speed_100MHz; gpio.GPIO_OType=GPIO_OType_PP; gpio.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOE,&gpio); //LCD !RST B11 gpio.GPIO_Pin=GPIO_Pin_11; gpio.GPIO_Mode=GPIO_Mode_OUT; gpio.GPIO_Speed=GPIO_Speed_2MHz; gpio.GPIO_OType=GPIO_OType_PP; gpio.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOB,&gpio); //LCD WSYNC B3 gpio.GPIO_Pin=GPIO_Pin_3; gpio.GPIO_Mode=GPIO_Mode_IN; gpio.GPIO_Speed=GPIO_Speed_2MHz; gpio.GPIO_OType=GPIO_OType_PP; gpio.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOB,&gpio); //LED TEST D12 gpio.GPIO_Pin=GPIO_Pin_12; gpio.GPIO_Mode=GPIO_Mode_OUT; gpio.GPIO_Speed=GPIO_Speed_2MHz; gpio.GPIO_OType=GPIO_OType_PP; gpio.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOD,&gpio); } void FSMC(void) //!!! HCLK=168 MHz { FSMC_NORSRAMTimingInitTypeDef fsmcTimingRead,fsmcTimingWrite; FSMC_NORSRAMInitTypeDef fsmc; RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE); fsmcTimingRead.FSMC_AddressSetupTime=1; //!!! fsmcTimingRead.FSMC_AddressHoldTime=0; fsmcTimingRead.FSMC_DataSetupTime=13; //RD fsmcTimingRead.FSMC_BusTurnAroundDuration=0; fsmcTimingRead.FSMC_CLKDivision=0; fsmcTimingRead.FSMC_DataLatency=0; fsmcTimingRead.FSMC_AccessMode=FSMC_AccessMode_A; memcpy(&fsmcTimingWrite,&fsmcTimingRead,sizeof(fsmcTimingRead)); fsmcTimingWrite.FSMC_DataSetupTime=2; //WR fsmc.FSMC_Bank=FSMC_Bank1_NORSRAM1; fsmc.FSMC_DataAddressMux=FSMC_DataAddressMux_Disable; fsmc.FSMC_MemoryType=FSMC_MemoryType_SRAM; fsmc.FSMC_MemoryDataWidth=FSMC_MemoryDataWidth_8b; fsmc.FSMC_BurstAccessMode=FSMC_BurstAccessMode_Disable; fsmc.FSMC_WaitSignalPolarity=FSMC_WaitSignalPolarity_Low; fsmc.FSMC_WrapMode=FSMC_WrapMode_Disable; fsmc.FSMC_WaitSignalActive=FSMC_WaitSignalActive_BeforeWaitState; fsmc.FSMC_WriteOperation=FSMC_WriteOperation_Enable; fsmc.FSMC_WaitSignal=FSMC_WaitSignal_Disable; fsmc.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; fsmc.FSMC_ExtendedMode=FSMC_ExtendedMode_Enable; //For Different Read & Write Timings !!! fsmc.FSMC_WriteBurst=FSMC_WriteBurst_Disable; fsmc.FSMC_ReadWriteTimingStruct=&fsmcTimingRead; fsmc.FSMC_WriteTimingStruct=&fsmcTimingWrite; FSMC_NORSRAMInit(&fsmc); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1,ENABLE); }
  2. Странно, что никто не ответил, неужели Win XP в связке с STM32H7xx Никто не пользует вмести с кейлом 5.16 ?
  3. Привет. Натыкаюсь на подделки при поиске дисплеев от сотового телефона Sony Ericsson w580 / s500. То стекло разбито с краёв, то цвета в холодном синем тоне, то под углами не рассматривается. Прилагаю картинки - слева оригинальный дисплей от телефона(родной, стоит в телефоне). Справа купленные копии: на верхней картинке откровенный Китай, на второй тоже Китай, но сбоку плохо смотрится, DATA SETUP TIME в 2 раза больше на времянках чтения/записи. Ищу аналогичную замену родному, потому что с угла кусочек разбит и много сильных царапин. Посоветуйте где купить ИСТИННО-ОРИГИНАЛЬНЫЙ LCD ? Или только в донорах искать б/у? А то уже кучу денег выкинул - удовлетворения 0. Слева родной дисплей, справа - откровенный Китай(300р): Слева родной дисплей, справа - Китай(800р): Подделки: Откровенный Китай: и Китай:
  4. Поставил паки вручную, попросту заменив расширение файлов в pak и разжав архиватором. И перенес в папки Кейла. Теперь при открытии проекта в Кейле в консоли лога билда идёт такая ошибка: Полагаю, что это дебаггер корячится, на сборку бинарника это не влияет. Во вкладках Debugger снес пути к dll-кам, и снял все галочки. Ошибка при открытии проекта не ушла. Можно ли отключить коннект дебаггера, чтоб не коннектился?
  5. Здравствуйте. Использую ОС WinXP и Keil ARM MDK v. 5.16a. Скачал паки : Keil.STM32H7xx_DFP.1.0.0.pack Keil.STM32H7xx_DFP.1.0.1.pack Keil.STM32H7xx_DFP.2.0.0.pack Keil.STM32H7xx_DFP.2.1.0.pack Не получается установить до конца ни один из них, ближе к концу выходит ошибка: "SDVConv exited with an error. No uVision SystemView file created" и усё..... Потом эти паки разжал обычным архиватором ZIP и просмотрел. Родилась идея вручную всё пихнуть в Кейл. Использовать блевисты к сожалению не могу. Есть ли возможность под WinXP работать под Keil v5.16a и программить для STM32H743 ? Перефразирую свой вопрос: Можно паки поставить вручную? SDV как я понял - для дебага и нафиг мне сдался. Мне главное стартап правильный сгенерить и инит на SPL, CMSIS. Или тут без HAL с CUBE делать нечего?
  6. Всем спасибо за помощь! :a14: Я вначале подумал, что она заточена только под I.MX. Теперь вижу, что она универсальна! Нашёл её здесь: ftp://125.7.130.110/imx/5/Mfgtools-Rel-1....Utils/cfimager/ Теперь действительно стало проще лить образ без всяких дополнительных файлов и склеиваний - в батник её прописал после билда и чек-суммы, получилась сборка в 1 клик: cfimager.exe -raw -offset 0x2000 -f spl.bin -d F где F - буква диска SD-карты Когда писал под STM32, то открывал Keil исключительно для сборки проекта. Код писал в блокноте. В GCC ошибки выдаются в консоли: номер строки + тип ошибки = достаточно чтобы найти и исправить, не забыть в конце батника pause добавить, а то закроется. Или можно из под MSYS работать (или как там его - желтого цвета в винде mingw32 ...) Если сорцов много, то мейк-файл. Я ради этого купил карту 16 ГБ UHS-I , пригодится в хозяйстве. Хотя и на старой карте 2 ГБ без класса скорости работают мои программы --- 2 вопроса: 1) Какими командами с помощью U-Boot загрузить по UART1 программу и дать ей управление? И по какому адресу должен быть слинкован код для A13 ? С AT91RM9200 было так: был DFU Downloader, 2 команды: Load и Go 2) spl-sunxi.bin - инитит всё железо(тактовую частоту, SDRAM, MMU) или нет? Или это уже U-boot делает? Просто если spl-sunxi.bin всё инитит, что с ним проще, особенно, если он может что-то загрузить
  7. Спасибо всем кто хотел помочь и помог! :1111493779: Удалось запустить плату с A13 ! :rolleyes: Было 2 ошибки. Ошибка номер 1. Начал с проверки COM-порта. Замкнул вывод 2 с выводом 3 на системном блоке компа, убедился как тут писали, что связь есть: получаю то же, что и отправляю. Значит порт исправен и WinXP дает доступ к нему. Дальше: подсоединил адаптер, запитал его от 3,3V от платы A13-Olinuxino. Выводы TX и RX адаптера соединил вместе. Вот тут и зарылась собака - в ответ летит не то, что отправляю! Запитал адаптер отдельно от 5V, протестил: обмен исправен. Понизил питание до 3V - снова пошла лажа на скорости 115200 бит/c!. Понизил скорость до 2400 бит/c - обмен при питании 3V нормальный. Сделал вывод, что тот MAX3232, что стоит в адаптере не позволяет при питании 3,3V давать обмен на 115200 бит/c. Порылся в закромах, нашёл в резерве одну MAX3232, выпаял ту что была на адаптере и впаял новую. Проверил снова обмен при 5V и при 3.3V на скорости 115200 бит/c - работает исправно! Делаю вывод о бракованной партии микросхем MAX3232, которая попала мне в адаптере. Фотка фуфела MAX3232, не работающего на 115200 бит/с при 3,3V: Фотка нормальной микросхемы: Ошибка номер 2. Программа дискового редактора, которую я использовал: HxD Hex-редактор от Maёl Horz, неверно делала запись на 16-й сектор карты! Позже, скачав win32-disk-imager-0-7-en-win.zip (эта не свежая версия, но идёт под WinXP, что для меня важно!) и записав образ sunxi-spl.bin из папки a13_olinuxino_hwpack, я получил наконец-то запуск программы на A13: Действительно, для отладки используется порт UART1. Образ sunxi-spl.bin для A13 прилагаю: sunxi_spl.zip ну и далее попробовал запустить Debian, тот самый, что якобы на карту с 4 ГБ влезает (на самом деле нет, олимексовцы по-мойму забыли, что 4 ГБ это не 4*1024^3 байт, а 4*1000^3 :) ) всё пошло: Качал вот этот архив: A13_debian_34_90_mainline_u-boot_release_11_3.7z, с торрента - файл прикладываю: A13_debian_34_90_mainline_u_boot_release_11_3.zip Естественно, перед заливкой образа, архив распаковать. Образ писал программой, что описана выше: win32-disk-imager-0-7-en-win.zip Потом всё-же решил посмотреть, где же глючит HxD и почему она пишет 16-й сектор не туда, куда надо и не видит там ничего после записи win32-disk-imager-0-7-en-win.zip. Для этого прочёл образ с карты (1% достаточно) и увидел, что сигнатура eGON.BT0 была на 145-м секторе! Делайте выводы, господа! Вот так софтина может подставить программиста! --- Шаг 3. После как разобрался в ошибках, попробовал закатать образ своей программы с мигающим светодиодом. Так как HxD - оказался на поверку говном, а win32-disk-imager не может писать образы не с начала, пришлось 0x2000 байт с самого начала SD-карты скопировать в отдельный файл. Затем бинарно клеить эти 0x2000 байт со своей программой (у которой уже есть хедер и посчитана контрольная сумма). Тоесть алгоритм такой: 1) компилируем и линкуем свою программу (при этом моделируя набросок заголовка: прыжок на main(), заполняя оставшееся место нулями) 2) вычисляем контрольную сумму в получившемся бинарнике (я использую checksumm.exe собственноручно скомпилированную из сорцов Гитхаба) 3) склеиваем 2 файла: первые 0x2000 байт со своим бинарником (я использую свой конкатенатор concat.exe) 4) полученный файл *.img катаем на SD-карту win32-disk-imager-ом. 5) вставляем карту в A13-olinuxino, включаем питание и радуемся результату! :) Загрузка мгновенна, никаких кнопок Power и Home/U-boot жать не надо! Прикрепляю рабочий проект целиком - оптимизация по скорости, максимальная. Проект перелопатил из олимексовского говнокода. (+ утилита для контрольной суммы): A13_led.zip Использую такие тулчейны: gcc-arm-none-eabi-6-2017-q2-update-win32.exe gcc-arm-none-eabi-4_8-2014q3-20140805-win32.exe Без разницы какой, после инсталляции важно прописать переменные окружения в операционной системе , иначе не будет работать как надо. Сорцы пишу в Блокноте (с синтаксической подсветкой типа "Bred"), для сборки батники или make-файлы. По-мойму это лучше, чем искать проприетарное тяжеловесное дерьмо, за которое мудаки требуют деньги (в контексте последних ARM-ов). И к тому же которое под WinXP идёт либо криво или вообще не пускается. Ну и вспомогательные вещи: утилита склейки concat.exe и файл первых 0x2000 байт, которые должны быть до программы. Утилита склеивает 2 файла : "0x2000.bin" и "spl.bin" в один "image.img" - его катать на карту win32-disk-imager-ом! concat_util.zip Если достать нормальный дисковый редактор, то можно сразу spl.bin катать на 16-й сектор. Без всяких склеек с 0x2000.bin. Но пока такой программы не нашёл, все клянчат деньги и не дают работать на запись... --- В целом я рад - началу освоения Alwinner положено!!! :yeah: Надеюсь, что то что написал, поможет начинающим разобраться и не спотыкаться на те грабли, что мне пришлось испытать. :smile3046: to mantech: регистры, порты ввода-вывода, переменные, менющиеся в обработчиках прерываний - должны быть объявлены как volatile, иначе компилятор оставляет за собой право выкинуть часть кода или закешировать эти переменные в регистры (особенно с максимальной оптимизацией, где не учитывается специфика работы с аппаратурой: допускается многократное присваивание в один и тот же регистр) :)
  8. :) Да я уже переписал его, ещё там в дефайнах скобки нужно добавить и комментарии возле дефайнов заменить на /* */ вместо //, иначе что-то может закоментиться :) Этот вариант должен работать , но не работает (вставка хедера сделана, проверил в дизассемблере и в бинарнике - прыгает куда надо): #define uint32_t unsigned long int #define CCMBase 0x01C20000 /* clock module */ #define Def_APB0_Gating (CCMBase + 0x68) #define GPIOBase 0x01C20800 #define GPIOIncrement 0x24 #define ALLWINNER_GPIO_A GPIOBase #define ALLWINNER_GPIO_B (GPIOBase + (1*GPIOIncrement)) #define ALLWINNER_GPIO_C (GPIOBase + (2*GPIOIncrement)) #define ALLWINNER_GPIO_D (GPIOBase + (3*GPIOIncrement)) #define ALLWINNER_GPIO_E (GPIOBase + (4*GPIOIncrement)) #define ALLWINNER_GPIO_F (GPIOBase + (5*GPIOIncrement)) #define ALLWINNER_GPIO_G (GPIOBase + (6*GPIOIncrement)) #define ALLWINNER_GPIO_H (GPIOBase + (7*GPIOIncrement)) #define ALLWINNER_GPIO_I (GPIOBase + (8*GPIOIncrement)) #define Port_CFG0 0x00 /* pin direction and function 0 to 7 */ #define Port_CFG1 0x04 /* pin direction and function 8 to 15 */ #define Port_CFG2 0x08 /* pin direction and function 16 to 24 */ #define Port_CFG3 0x0C /* pin direction and function 25 to 32 */ #define Port_DAT 0x10 #define Port_DRV0 0x14 #define Port_DRV1 0x18 #define Port_PUL0 0x1C /* A workaround for https://patchwork.ozlabs.org/patch/622173 */ void __attribute__((section(".start"))) __attribute__((naked)) start(void) { __asm__ __volatile__ (".long 0xEA00000A \n" // jump main() ".long 0x4E4F4765 \n" // eGON ".long 0x3054422E \n" // .BT0 ".long 0x00000000 \n" // checksum ".long 0x00001000 \n" // 4kB size ".long 0x00000000 \n" // header size! ".long 0x00000000 \n" ".long 0x00000000 \n" ".long 0x00000000 \n" ".long 0x00000000 \n" ".long 0x00000000 \n" ".long 0x00000000 \n"); /* u32, Jump to address 8 * u8, Magic "eGON.BT0" (no \n) 32u, checksum for boot0 32u, length for boot0 32u, header size of boot0 4 * u8, header version 4 * u8, Boot_vsn 4 * u8, eGON_vsn 8 * u8, platform information */ } void main(void) { volatile uint32_t *APB0Gating; volatile uint32_t *portGConfig; volatile uint32_t *portGData; //setup pointers for registers APB0Gating = (volatile uint32_t*)(Def_APB0_Gating); portGConfig = (volatile uint32_t*)(ALLWINNER_GPIO_G+Port_CFG1); portGData = (volatile uint32_t*)(ALLWINNER_GPIO_G+Port_DAT); //enable clocking for GPIO *APB0Gating|=0x0020; //configure port G pin 9 to output *portGConfig|=0x10; //set output to on: *portGData|=0x0200; Loop: goto Loop; } [code]Disassembly of section .start: 00000000 <start>: 0: ea00000a b 30 <main> 4: 4e4f4765 cdpmi 7, 4, cr4, cr15, cr5, {3} 8: 3054422e subscc r4, r4, lr, lsr #4 c: 00000000 andeq r0, r0, r0 10: 00001000 andeq r1, r0, r0 ... Disassembly of section .text: 00000030 <main>: 30: e3a03000 mov r3, #0 34: e34031c2 movt r3, #450; 0x1c2 38: e5932068 ldr r2, [r3, #104]; 0x68 3c: e3822020 orr r2, r2, #32 40: e5832068 str r2, [r3, #104]; 0x68 44: e59328dc ldr r2, [r3, #2268]; 0x8dc 48: e3822010 orr r2, r2, #16 4c: e58328dc str r2, [r3, #2268]; 0x8dc 50: e59328e8 ldr r2, [r3, #2280]; 0x8e8 54: e3822c02 orr r2, r2, #512; 0x200 58: e58328e8 str r2, [r3, #2280]; 0x8e8 5c: eafffffe b 5c <main+0x2c> [/code] Контрольную сумму в хедере вычисляю утилитой с гитхаба (её тоже собрать самому пришлось!) Завтра попробую закатать образ на другую карту (надо сбегать и купить её)
  9. Вот такой адаптер (MAX3232 )
  10. В общем что это http://radiokot.ru/articles/59/ что это: https://www.olimex.com/wiki/Bare_Metal_programming_A13 - нерабочий говнокод. Во втором понятно, почему не работает , а на счёт первого у меня догадки: сигнатура с хедером там дают смещение кода на не кратный 4-м адрес - такое в ARM работать не должно вообще. Складывается впечатление, что те кто писал обе статьи - просто мудаки, которые пишут о том, что не работает. Но это не стыкуется с распиновкой MAX3232 ! вашем варианте сигнал пойдёт к выходу буфера, и выйдет из входа, что ошибка. Но всёравно попробовал поменять TXD на RXD и наоборот - результата не дало. Пробовал на UART 1 и 0. На SD карте SPL и U-Boot.
  11. На счёт соединения с ком-портом, адаптер вызвонил весь - картинка ниже. Правда непонтно, что на Olinuxino-A13 плате имелось ввиду под TX и RX - это по отношению к кому и от кого??? Проверьте пожалуйста -верно ли подключено? Для у-бута нужен UART1 ? Или UART 0 ? Это так на форуме Олимекса было написано. Уже давно исправил регистры на VOLATILE и проверил в листинге. Ещё такая вещь, делаю LDR R0, #0x1C80082E - ассемблер делает: LDR R0, [PC, #0x20] - константу берет из памяти со смещением. Позже узнал, что ARM не может присваивать слово с ненулевыми байтами сразу.Это - жесть. Уже сделал через ORR, чтоб исключить стек и память, и -fPIC поставил, чтобы перестраховаться от того, что если код будет загружен не в 0x0 а в другие адреса. Уже до написания на ассемблере дошло, не идёт всёравно: .long 0xEA00000A .long 0x4E4F4765 .long 0x3054422E .long 0x00000000 .long 0x00001000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 mov r0, #0x01000000 orr r0,r0,#0x00C20000 orr r0,r0,#0x00000068 ldr r0,[r0] orr r0,r0, #0x0020 mov r1, #0x01000000 orr r1,r1,#0x00C20000 orr r1,r1,#0x00000068 str r0,[r1] mov r0, #0x01000000 orr r0,r0,#0x00C20000 orr r0,r0,#0x00000800 orr r0,r0,#0x000000D8 ldr r0,[r0] orr r0,r0, #0x0010 mov r1, #0x01000000 orr r1,r1,#0x00C20000 orr r1,r1,#0x00000800 orr r1,r1,#0x000000D8 str r0,[r1] mov r0, #0x01000000 orr r0,r0,#0x00C20000 orr r0,r0,#0x00000800 orr r0,r0,#0x000000E8 ldr r0,[r0] orr r0,r0, #0x0200 mov r1, #0x01000000 orr r1,r1,#0x00C20000 orr r1,r1,#0x00000800 orr r1,r1,#0x000000E8 str r0,[r1] хотя теоретически должно... Скачал A13_debian_34_90_mainline_u-boot_release_11_3.img , но он не лезет на 4 Гб SD карту. Складывается впечатление, что дело в карте. Жесть! Но думаю, что это из-за криворукости того кто написал программу - там нет волатайлов ))) от туда и брал вначале этот говнокод Я чётко и ясно писал названия дистров, бинарников и образов. Некоторые (последние) были скачаны с сайта Олимекса. А вот почему в железе оно не работает - очень непонятно.
  12. Я много вариантов перепробовал: и с мигающим диодом и не с мигающим. Ничего не работает. И ссылку давал постом выше на тот Spl и u-boot, там ясно написано что он для olinuxino-A13. Заливал и SPL и U-boot - результат один - ничерта ничего не работает. А те нули которые в терминале - разобрался, это наводка по воздуху, что доказывает, что UART1 не заводится, значит с SD-карты u-boot не грузится. Много перепробовал готовых образов - ничего вообще не запускается и в терминале не бежит. Пробовал ещё это: http://radiokot.ru/articles/59/ там готовый бинарник есть, он тоже не пошёл. Всё тоже самое пробовал на другой отладке - A13-SOM - результат такой же (точнее -без результата). Могут ли быть проблемы с SD-картой? У меня SDmicro 4GB с классом 4. Просто складывается впечатление, что приобрёл кирпичи, в Терраэлектронике, кстати, брал обе платы (Olinuxino и SOM) - напаяно дерьмовым образом - куча флюса оставлено и контроллер криво запаян как будто дрожащей рукой кто-то паял (неровности на контактах) Никто не ковырял Alwinner-ы ? Мне одному выпала такая участь?
  13. Взял spl и u-boot отсюдова: http://dl.linux-sunxi.org/users/amery/sunxi-3.0/latest/ Архив: a13_olinuxino_hwpack.tar.xz Закатал spl с 16-го сектор а карты, u-boot с 64-го сектора. Скачал терминалку, при включенни питания на плату, валят несколько нулей, причем независимо от того стоит SD карта или нет. Если что-то послать, в ответ идут снова нули. Подключился к UART1. Соединение прямое: TX allwinner => TX адаптера RS232-UART, RX alwinner => RX адаптера. Питание 3,3V с платы на адаптер, GND вместе. Бред идёт какой-то в общем: WinXP, в биосе порт включен (COM1 0x2F8)
  14. Приобрёл адаптер RS232 <>UART. К какому UART цепляться к UART1 или UART0 ? На линиях UART0 сидит карта SD - конфликт? Формат данных: 115200, 8 , N, 1? Для убута надо: u-boot-sunxi-with-spl.bin или 2 файла: sunxi-spl.bin и u-boot.img - бинарников не нашёл, только огромный tar.gz который надо самому собирать и компилить. Поделитесь плиз SPL и U-Boot-ом для A13 пожалуйста. А то чувствую себя застрявшим уже 2й день..
  15. Ещё один момент: на отладочной плате A13-Olinuxino не установлена NAND-Flash микросхема, и перемычка (SMD) замкнута: NCE_NAND_E - это Chip Enable как я понимаю. Может процессор пытается с неё загрузиться и перемычку надо разомкнуть, чтоб с SD карты пошла загрузка? Если да, прийдётся скальпелем резать потому что перемычка замкнута печатным проводником, а не резистором
  16. может быть проблема в этом: sudo dd if=bin/release.bin of=/dev/sdb bs=1024 seek=8 И почему bs=1024, когда сектор карты 512 байт? И что мне вместо sudo в винде использовать? Пока пишу дисковым редактором на 16-й сектор карты памяти. С uboot пока бесполезно, нету под рукой RS232 <=> UART Может всё-же проверяет карту и если там упоминание о винде(первые 2 сектора), то не грузится?
  17. Здравствуйте! Начал осваивать Allwinner A13 и пока безуспешно. Использую отладочную плату "A13-olinuxino", загрузиться хочу с SD карты (4 ГБ класс скорости 4). Компилятор arm-none-eabi , исходник программы ниже, мигает светодиодом на порте G 9 (штатный порт на отладочной плате со светодиодом): #define uint32_t unsigned long int #define CCMBase 0x01C20000 //clock module #define Def_APB0_Gating CCMBase + 0x68 //#define Def_APB0_Gating 0x01C20068 #define GPIOBase 0x01C20800 #define GPIOIncrement 0x24 #define ALLWINNER_GPIO_A GPIOBase #define ALLWINNER_GPIO_B GPIOBase + (1*GPIOIncrement) #define ALLWINNER_GPIO_C GPIOBase + (2*GPIOIncrement) #define ALLWINNER_GPIO_D GPIOBase + (3*GPIOIncrement) #define ALLWINNER_GPIO_E GPIOBase + (4*GPIOIncrement) #define ALLWINNER_GPIO_F GPIOBase + (5*GPIOIncrement) #define ALLWINNER_GPIO_G GPIOBase + (6*GPIOIncrement) #define ALLWINNER_GPIO_H GPIOBase + (7*GPIOIncrement) #define ALLWINNER_GPIO_I GPIOBase + (8*GPIOIncrement) #define Port_CFG0 0x00 //pin direction and function 0 to 7 #define Port_CFG1 0x04 //pin direction and function 8 to 15 #define Port_CFG2 0x08 //pin direction and function 16 to 24 #define Port_CFG3 0x0C //pin direction and function 25 to 32 #define Port_DAT 0x10 #define Port_DRV0 0x14 #define Port_DRV1 0x18 #define Port_PUL0 0x1C void main(void) { int i; int j; int foo; uint32_t *portGConfig; uint32_t *portGData; uint32_t *APB0Gating; //setup pointers for registers portGConfig = (uint32_t *)(ALLWINNER_GPIO_G + Port_CFG1); portGData = (uint32_t *)(ALLWINNER_GPIO_G + Port_DAT); APB0Gating = (uint32_t *)(Def_APB0_Gating); //enable clocking for GPIO *APB0Gating |= 0x0020; //configure port G pin 9 to output *portGConfig |= 0x10; //set output to on *portGData |= 0x0200; Loop: foo = 0; for (j = 0; j < 100; j++) { //toggle output *portGData ^= 0x0200; foo=j; for (i = 0; i < 30000000; i++) { if(i>10) { foo++; } } } goto Loop; } Файл линковщика: MEMORY { RAM (XRW) : ORIGIN = 0x00000000, LENGTH = 0x00004000 /* 16 KB */ } SECTIONS { .start : { *(.start) } > RAM .text : { *(.text) } > RAM .bss : { *(.bss) } > RAM .fill : { FILL(0x00); . = ORIGIN(RAM) + LENGTH(RAM) - 1; BYTE(0x00); } > RAM /DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.interp*) } /DISCARD/ : { *(.gnu*) } /DISCARD/ : { *(.note*) } } ассемблерный листинг: test.elf: file format elf32-littlearm Disassembly of section .text.startup: 00000000 <main>: 0: e59f3030 ldr r3, [pc, #48]; 38 <main+0x38> 4: e5932068 ldr r2, [r3, #104]; 0x68 8: e3822020 orr r2, r2, #32 c: e5832068 str r2, [r3, #104]; 0x68 10: e59328dc ldr r2, [r3, #2268]; 0x8dc 14: e3822010 orr r2, r2, #16 18: e58328dc str r2, [r3, #2268]; 0x8dc 1c: e59328e8 ldr r2, [r3, #2280]; 0x8e8 20: e3822c02 orr r2, r2, #512; 0x200 24: e58328e8 str r2, [r3, #2280]; 0x8e8 28: e59f300c ldr r3, [pc, #12]; 3c <main+0x3c> 2c: e2533001 subs r3, r3, #1 30: 1afffffd bne 2c <main+0x2c> 34: eafffffb b 28 <main+0x28> мейк-скрипт: arm-none-eabi-gcc -Os -march=armv7-a -std=c99 -marm -fpic -Wall -fno-common -fno-builtin -ffreestanding -nostdinc -nostdlib -fno-strict-aliasing -mno-thumb-interwork -fno-stack-protector -fno-toplevel-reorder -Wstrict-prototypes -Wno-format-nonliteral -Wno-format-security -c test.c -o test.o arm-none-eabi-ld -T test.lds -M -o test.elf test.o arm-none-eabi-objdump -D test.elf > test.asm arm-none-eabi-objcopy -O binary test.elf test.bin mksunxiboot.exe test.bin test-sd.bin Для создания загрузочного образа использую программу с аргументами: mksunxiboot.exe test.bin test-sd.bin С помощью дискового редактора копирую весь образ на 16-й сектор карты памяти (это смещение 8кБ от начала). Карта памяти отформатирована в винде. Первые сектора - ДОСовский загрузчик-заглушка . Из ассемблерного листинга видно что программа идет с адреса 0, как требуется в A13. Хедер вроде тоже с верной контрольной суммой. Стек инитится BROM-ом (при старте) SP=0x7FF8 Вставляю карту в одладочную плату, подаю питание (внешний БП 6V 2A) - и ничего не горит. Пожалуйста, помогите разобраться, чего не хватает и что не так? Весь проект прилагаю, мейк-файлы, скрипты и утилиты там же. src.zip P.S. Звонил светодиод и ножку контроллера - контакт есть, диод зажигается от тестера. Объявил переменные volatile, не помогло: void main(void) { volatile int i; volatile int j; volatile int foo; volatile uint32_t *portGConfig; volatile uint32_t *portGData; volatile uint32_t *APB0Gating; //setup pointers for registers portGConfig = (volatile uint32_t *)(ALLWINNER_GPIO_G + Port_CFG1); portGData = (volatile uint32_t *)(ALLWINNER_GPIO_G + Port_DAT); APB0Gating = (volatile uint32_t *)(Def_APB0_Gating); //enable clocking for GPIO *APB0Gating |= 0x0020; //configure port G pin 9 to output *portGConfig |= 0x10; //set output to on *portGData |= 0x0200; Loop: foo = 0; for (j = 0; j < 100; j++) { //toggle output *portGData ^= 0x0200; foo=j; for (i = 0; i < 30000000; i++) { if(i>10) { foo++; } } } goto Loop; } 00000000 <main>: 0: e59f3094 ldr r3, [pc, #148]; 9c <main+0x9c> 4: e24dd010 sub sp, sp, #16 8: e5932068 ldr r2, [r3, #104]; 0x68 c: e3822020 orr r2, r2, #32 10: e5832068 str r2, [r3, #104]; 0x68 14: e59328dc ldr r2, [r3, #2268]; 0x8dc 18: e3822010 orr r2, r2, #16 1c: e58328dc str r2, [r3, #2268]; 0x8dc 20: e59328e8 ldr r2, [r3, #2280]; 0x8e8 24: e3822c02 orr r2, r2, #512; 0x200 28: e58328e8 str r2, [r3, #2280]; 0x8e8 2c: e3a02000 mov r2, #0 30: e58d200c str r2, [sp, #12] 34: e58d2008 str r2, [sp, #8] 38: e59d2008 ldr r2, [sp, #8] 3c: e3520063 cmp r2, #99; 0x63 40: cafffff9 bgt 2c <main+0x2c> 44: e59328e8 ldr r2, [r3, #2280]; 0x8e8 48: e2222c02 eor r2, r2, #512; 0x200 4c: e58328e8 str r2, [r3, #2280]; 0x8e8 50: e59d2008 ldr r2, [sp, #8] 54: e58d200c str r2, [sp, #12] 58: e3a02000 mov r2, #0 5c: e58d2004 str r2, [sp, #4] 60: e59d1004 ldr r1, [sp, #4] 64: e59f2034 ldr r2, [pc, #52]; a0 <main+0xa0> 68: e1510002 cmp r1, r2 6c: ca000007 bgt 90 <main+0x90> 70: e59d2004 ldr r2, [sp, #4] 74: e352000a cmp r2, #10 78: c59d200c ldrgt r2, [sp, #12] 7c: c2822001 addgt r2, r2, #1 80: c58d200c strgt r2, [sp, #12] 84: e59d2004 ldr r2, [sp, #4] 88: e2822001 add r2, r2, #1 8c: eafffff2 b 5c <main+0x5c> 90: e59d2008 ldr r2, [sp, #8] 94: e2822001 add r2, r2, #1 98: eaffffe5 b 34 <main+0x34> 9c: 01c20000 biceq r0, r2, r0 a0: 01c9c37f biceq ip, r9, pc, ror r3
  18. Я бы отталкивался от того, по каким линиям пойдут биты байта при записи в регистр tcon0_cpu_wr_reg. Проверить в принципе это можно, просто зациклив передачу в этот регистр и путём вызванивания тестером логического уровня на каждом бите. Увы и ах - осциллографа и логического анализатора под рукой нет. :( А так да, получается индусский говнокод с нагромождением. Но к сожалению, нормальных SDK под эти чипы нет Должно хватить вот этого(код я писал): #define CA 25 /* A1位 A1 bit */ #define TCON 0x01C0C000 /* TCON基地址 TCON Base Address */ #define TCON0_CPU_IF_REG *(volatile u32*)(TCON+0x60) #define TCON0_CPU_WR_REG *(volatile u32*)(TCON+0x64) void TCON0_INDEX(u32 index) { TCON0_CPU_IF_REG&=~(1UL<<CA); //清除CA位 clear CA bit TCON0_CPU_WR_REG=index; //写索引 write index } void TCON0_DATA(u32 data) { TCON0_CPU_IF_REG|=(1UL<<CA); //设置CA位 set CA bit TCON0_CPU_WR_REG=data; // 写入数据 write data } Не забыв отремапить ноги GPIO и включив тактирование нужных узлов периферии. и отынитить TCON для режима CPU I/F i8080 :) Ну и второй головняк - тайминги шины. Подозреваю, что на ширину строба записи будет влиять делитель для DCLK, а на длительность цикла - длина VSYNC лили LCDDE
  19. Поковырял немножко Linux BSP, "linux-master". Вырисовываются интересные вещи касаемо работы LCD в i8080 bus mode. __s32 LCD_CPU_WR(__u32 screen_id,__u32 index,__u32 data) { tcon0_cpu_wr_16b(screen_id,index,data); return 0; } __s32 LCD_CPU_WR_INDEX(__u32 screen_id,__u32 index) { tcon0_cpu_wr_16b_index(screen_id,index); return 0; } __s32 LCD_CPU_WR_DATA(__u32 screen_id,__u32 data) { tcon0_cpu_wr_16b_data(screen_id,data); return 0; } Пошёл дальше: s32 tcon0_cpu_wr_16b(u32 sel, u32 index, u32 data) { tcon0_cpu_wr_24b(sel,tcon0_cpu_16b_to_24b(index),tcon0_cpu_16b_to_24b(data)); return 0; } u32 tcon0_cpu_16b_to_24b(u32 value) { return ((value & 0xfc00)<<8) | ((value & 0x0300)<<6) | ((value & 0x00e0)<<5) | ((value & 0x001f)<<3); } s32 tcon0_cpu_wr_24b(u32 sel, u32 index, u32 data) { tcon0_cpu_wr_24b_index(sel,index); tcon0_cpu_wr_24b_data(sel,data); return 0; } s32 tcon0_cpu_wr_24b_index(u32 sel, u32 index) { u32 count = 0; while((tcon0_cpu_busy(sel)) && (count < 50)) { count ++; disp_delay_us(100); } lcd_dev[sel]->tcon0_cpu_ctl.bits.ca = 0; lcd_dev[sel]->tcon0_cpu_wr.bits.data_wr = index; return 0; } s32 tcon0_cpu_wr_24b_data(u32 sel, u32 data) { u32 count = 0; while((tcon0_cpu_busy(sel)) && (count < 50)) { count ++; disp_delay_us(100); } lcd_dev[sel]->tcon0_cpu_ctl.bits.ca = 1; //tcon0_cpu_if_reg_t lcd_dev[sel]->tcon0_cpu_wr.bits.data_wr = data; //tcon0_cpu_wr_reg_t return 0; } Тут мы видим, что перед посылкой байтов команды или данных - цикл с ожиданием пока устройство занято. Это очень плохо! Все параллельные шины с которыми приходилось работать - EBI у AT91RM9200, FSMC у STM32, FBI у Блекфина - не имели костыля для ожидания завершения. Сама процедура ожидания: u32 tcon0_cpu_busy(u32 sel) { if(lcd_dev[sel]->tcon0_cpu_ctl.bits.wr_flag || lcd_dev[sel]->tcon0_cpu_ctl.bits.rd_flag) return 1; else return 0; } Ну и интуитивно понятно, что структуры как раз описывают биты и смещения регистров от базового адреса. Как всё сложно описано!!! И всё для того чтобы послать на шину 8080 байт данных!!! Чего стоят только описания структур и юнионов: static volatile __de_lcd_dev_t *lcd_dev[2]; s32 tcon_set_reg_base(u32 sel, u32 base) { lcd_dev[sel]=(__de_lcd_dev_t *)base; return 0; } tcon_set_reg_base(screen_id,para->reg_base[DISP_MOD_LCD0]); tcon_set_reg_base(screen_id,para->reg_base[DISP_MOD_LCD1]); typedef struct { u32 reg_base[DISP_MOD_NUM]; u32 reg_size[DISP_MOD_NUM]; u32 irq_no[DISP_MOD_NUM]; s32 (*disp_int_process)(u32 sel); s32 (*vsync_event)(u32 sel); s32 (*start_process)(void); s32 (*capture_event)(u32 sel); s32 (*shadow_protect)(u32 sel, bool protect); disp_sw_init_para *sw_init_para; }__disp_bsp_init_para; //device define typedef struct { tcon_gctl_reg_t tcon_gctl; //0x000 tcon_gint0_reg_t tcon_gint0; //0x004 tcon_gint1_reg_t tcon_gint1; //0x008 tcon_reservd_reg_t tcon_reg00c; //0x00c tcon0_frm_ctl_reg_t tcon0_frm_ctl; //0x010 tcon0_frm_seed_reg_t tcon0_frm_seed_pr; //0x014 tcon0_frm_seed_reg_t tcon0_frm_seed_pg; //0x018 tcon0_frm_seed_reg_t tcon0_frm_seed_pb; //0x01c tcon0_frm_seed_reg_t tcon0_frm_seed_lr; //0x020 tcon0_frm_seed_reg_t tcon0_frm_seed_lg; //0x024 tcon0_frm_seed_reg_t tcon0_frm_seed_lb; //0x028 tcon0_frm_tab_reg_t tcon0_frm_tbl_0; //0x02c tcon0_frm_tab_reg_t tcon0_frm_tbl_1; //0x030 tcon0_frm_tab_reg_t tcon0_frm_tbl_2; //0x034 tcon0_frm_tab_reg_t tcon0_frm_tbl_3; //0x038 tcon_reservd_reg_t tcon_reg03c; //0x03c tcon0_ctl_reg_t tcon0_ctl; //0x040 tcon0_dclk_reg_t tcon0_dclk; //0x044 tcon0_basic0_reg_t tcon0_basic0; //0x048 tcon0_basic1_reg_t tcon0_basic1; //0x04c tcon0_basic2_reg_t tcon0_basic2; //0x050 tcon0_basic3_reg_t tcon0_basic3; //0x054 tcon0_hv_if_reg_t tcon0_hv_ctl; //0x058 tcon_reservd_reg_t tcon_reg05c; //0x05c tcon0_cpu_if_reg_t tcon0_cpu_ctl; //0x060 tcon0_cpu_wr_reg_t tcon0_cpu_wr; //0x064 tcon0_cpu_rd0_reg_t tcon0_cpu_rd; //0x068 tcon0_cpu_rd1_reg_t tcon0_cpu_fet; //0x06c tcon_reservd_reg_t tcon_reg070[6]; //0x070~0x84 tcon0_io_pol_reg_t tcon0_io_pol; //0x088 tcon0_io_tri_reg_t tcon0_io_tri; //0x08c tcon1_ctl_reg_t tcon1_ctl; //0x090 tcon1_basic0_reg_t tcon1_basic0; //0x094 tcon1_basic1_reg_t tcon1_basic1; //0x098 tcon1_basic2_reg_t tcon1_basic2; //0x09c tcon1_basic3_reg_t tcon1_basic3; //0x0a0 tcon1_basic4_reg_t tcon1_basic4; //0x0a4 tcon1_basic5_reg_t tcon1_basic5; //0x0a8 tcon_reservd_reg_t tcon_reg0ac; //0x0ac tcon1_ps_sync_reg_t tcon1_ps_ctl; //0x0b0 tcon_reservd_reg_t tcon_reg0b4[15]; //0x0b4~0x0ec tcon1_io_pol_reg_t tcon1_io_pol; //0x0f0 tcon1_io_tri_reg_t tcon1_io_tri; //0x0f4 tcon_ecc_fifo_reg_t tcon_ecfifo_ctl; //0x0f8 tcon_debug_reg_t tcon_debug; //0x0fc tcon_ceu_ctl_reg_t tcon_ceu_ctl; //0x110 tcon_reservd_reg_t tcon_reg104[3]; //0x104~0x10c tcon_ceu_coef_mul_reg_t tcon_ceu_coef_rr; //0x110 tcon_ceu_coef_mul_reg_t tcon_ceu_coef_rg; //0x114 tcon_ceu_coef_mul_reg_t tcon_ceu_coef_rb; //0x118 tcon_ceu_coef_add_reg_t tcon_ceu_coef_rc; //0x11c tcon_ceu_coef_mul_reg_t tcon_ceu_coef_gr; //0x120 tcon_ceu_coef_mul_reg_t tcon_ceu_coef_gg; //0x124 tcon_ceu_coef_mul_reg_t tcon_ceu_coef_gb; //0x128 tcon_ceu_coef_add_reg_t tcon_ceu_coef_gc; //0x12c tcon_ceu_coef_mul_reg_t tcon_ceu_coef_br; //0x130 tcon_ceu_coef_mul_reg_t tcon_ceu_coef_bg; //0x134 tcon_ceu_coef_mul_reg_t tcon_ceu_coef_bb; //0x138 tcon_ceu_coef_add_reg_t tcon_ceu_coef_bc; //0x13c tcon_ceu_coef_rang_reg_t tcon_ceu_coef_rv; //0x140 tcon_ceu_coef_rang_reg_t tcon_ceu_coef_gv; //0x144 tcon_ceu_coef_rang_reg_t tcon_ceu_coef_bv; //0x148 tcon_reservd_reg_t tcon_reg14c[5]; //0x14c~0x15c tcon0_cpu_tri0_reg_t tcon0_cpu_tri0; //0x160 tcon0_cpu_tri1_reg_t tcon0_cpu_tri1; //0x164 tcon0_cpu_tri2_reg_t tcon0_cpu_tri2; //0x168 tcon0_cpu_tri3_reg_t tcon0_cpu_tri3; //0x16c tcon0_cpu_tri4_reg_t tcon0_cpu_tri4; //0x170 tcon0_cpu_tri5_reg_t tcon0_cpu_tri5; //0x174 tcon_reservd_reg_t tcon_reg178[2]; //0x178~0x17c tcon_cmap_ctl_reg_t tcon_cmap_ctl; //0x180 tcon_reservd_reg_t tcon_reg184[3]; //0x184~0x18c tcon_cmap_odd0_reg_t tcon_cmap_odd0; //0x190 tcon_cmap_odd1_reg_t tcon_cmap_odd1; //0x194 tcon_cmap_even0_reg_t tcon_cmap_even0; //0x198 tcon_cmap_even1_reg_t tcon_cmap_even1; //0x19c tcon_reservd_reg_t tcon_reg1a0[20]; //0x1a0~0x1ec tcon_safe_period_reg_t tcon_volume_ctl; //0x1f0 tcon_reservd_reg_t tcon_reg1f4[3]; //0x1f4~0x1fc tcon_mux_ctl_reg_t tcon_mul_ctl; //0x200 tcon_reservd_reg_t tcon_reg204[9]; //0x204~0x224 tcon_reservd_reg_t tcon_reg228[54]; //0x228~0x2fc tcon1_fill_ctl_reg_t tcon_fill_ctl; //0x300 tcon1_fill_begin_reg_t tcon_fill_start0; //0x304 tcon1_fill_end_reg_t tcon_fill_end0; //0x308 tcon1_fill_data_reg_t tcon_fill_data0; //0x30c tcon1_fill_begin_reg_t tcon_fill_start1; //0x310 tcon1_fill_end_reg_t tcon_fill_end1; //0x314 tcon1_fill_data_reg_t tcon_fill_data1; //0x318 tcon1_fill_begin_reg_t tcon_fill_start2; //0x31c tcon1_fill_end_reg_t tcon_fill_end2; //0x320 tcon1_fill_data_reg_t tcon_fill_data2; //0x324 tcon_reservd_reg_t tcon_reg328[54]; //0x328~0x3fc tcon_gamma_tlb_reg_t tcon_gamma_tlb[256]; //0x400 }__de_lcd_dev_t; typedef union { u32 dwval; struct { u32 trigger_en : 1; // default: 0; u32 trigger_start : 1; // default: 0; u32 trigger_fifo_en : 1; // default: 0; u32 trigger_fifo_bist_en : 1; // default: 0; u32 trigger_sync_mode : 2; // default: 0; u32 res0 : 10; // default:; u32 flush : 1; // default: 0; u32 auto_ : 1; // default: 0; u32 res1 : 4; // default:; u32 rd_flag : 1; // default: 0; u32 wr_flag : 1; // default: 0; u32 vsync_cs_sel : 1; // default: 0; u32 ca : 1; // default: 0; u32 da : 1; // default: 0; u32 res2 : 1; // default:; u32 cpu_mode : 4; // default: 0; } bits; } tcon0_cpu_if_reg_t; typedef union { u32 dwval; struct { u32 data_wr : 24; // default: 0; u32 res0 : 8; // default:; } bits; } tcon0_cpu_wr_reg_t; Предстоит жёсткий секс с Линуксом :) Начну-ка я наверно с A13, отладочной платы Olinuxino (тоже есть на руках). Чем-то напомнило индусский код :) Теперь надеюсь, вы поняли, почему я не люблю писать под линукс? Потому что громоздко и тормозит! Нужен чистый поток сознания в программировании!
  20. _pv, большое спасибо! :rolleyes: Вот как раз этой схемы мне не хватало, а я уже хотел логику прикидывать к CLK, LCDDE, чтобы выдать нужную полярность по стробам. Зарегался на том форуме и поинтересовался у китайцев - сказали, что всё как в A10, дали инфу по подключению и даташиты: https://debugdump.com/t_900.html Что понравилось - отвечают очень оперативно, возможно они контачат с Alwinner напрямую. Таблица подключения от A10 по назначению пинов совпадает с вашей картинкой: Очень надеюсь, что в v3s работа с дисплеем в режиме i8080 присутствует и её алгоритм аналогичен как в A20, A10. Почему я не хочу подключать дисплей по параллельному RGB? Потому что контроллер будет постоянно вынужден как угорелый рисовать кадр, в то время как он ещё будет не готов, а это несколько неудобно! Плюс отсутствие режимов LCD с выбором прямоугольника отрисовки, направлений - проще через встроенный контроллер дисплея это делать. Ну и как правило, большинство LCD матриц помимо простого RGB содержат ещё I2C/SPI порт для конфигурации. Так что в плане переносимости мне проще через i8080-BUS работать. Этот Alwinner полон загадок, заманчив высокой тактовой 1,2 ГГц + DDR 400 МГц, QFP корпусом и встроенной памятью. Но его загадочность меня настораживает :) Надо сообразить простейшую плату для опытов (v3s есть на руках), для питания пока поставлю обычнее LDO на 3.3V, 3V, 1.2V и 1.8V (точно в даташите смотреть надо). Наподобие как STM-NUCLEO - по минимуму обвязки: питание, кварц, пины на порты, MCU, SD карта памяти для загрузки. Конечно, после мигания светодиодами и ком-порта, прийдётся ковырять Linux BSP, что наверно трудоемко. А обращаться к дисплею в режиме 8080 как? (команды и данные слать) . Через TCON0_CPU_WR_REG, TCON0_CPU_RD0_REG и TCON0_CPU_RD1_REG ? Команда или данные выбираются через бит 25 регистра TCON0_CPU_IF_REG ? (управление A1). На первых порах конечно, линию DC LCD можно посадить на обычный GPIO без ущерба скорости, но хочется чтобы красиво было.
  21. мой ответ остался на предыдущей странице:)
  22. действие 1) проверка условия , если равно, выполняем: addeq r0,r1,r2 LSL r3 действие 2) сдвигаем r2 влево на значение бит в r3: addeq r0,r1,r2 LSL r3 действие 3) складываем r2 с r1: addeq r0,r1,r2 LSL r3: дейсвтвие 4) записываем результат в r0: addeq r0,r1,r2 LSL r3 У Блекфина как-то тухло: ... P1.L = _LCD; P1.H = _LCD; .align 2 P0 = 272; P1 = P1 + P0; P0 = -256; P1 = P1 + P0; P0 = 144; [--SP] = (P5:3); P2 = 64; P5 = 0 P5.H = 8193 LOOP .P36L2L LC0 = P0; ... Это типа ногодрыга как GPIO ? Надо 16 бит данных, 1 бит адреса, стробы CS, WR. На строб RD можно забить(не нужен, подтянуть к Vcc). Типа DSP-инструкция, SIMD к тому же! :) ----- Касаемо Олвиннера V3s. Вышел на форум китайцев https://debugdump.com/t_576.html - тут они тот самый дисплей что у меня (контроллер тот же) подключают к... SPI - и быстродействие всего 10 FPS. Видимо, через 16 битную шину его не подрубить, раз SPI взяли
  23. :) Просто меня сбила с толку улыбающаяся тётка с повязкой на лбу, выпускающая бабочек :) (её можно встретить часто на продукцииях STM)
  24. Если сравнить обсуждаемые здесь Кинетисы с таким поделием восточных друзей - STM32H743, какой из этих камней более предпочтителен в плане отсутствия глюков (не сырости) и открытой документации?
  25. Усовершенствованный вариант Lossless видео-кодека "PackMan" - с мульти-стратегическим конвейером. Теперь жмёт ещё лучше! Не совместим с ранними версиями ! Исходники усовершенствованного кодера/декодера, там же и билды под Win32, DOS: PackMan_r2_.zip Исходники усовершенствованного декодера для nanoPlayer: nanoPlay_PackMan2.zip Вариант печатной платы (4-слойка) герберы: nanoPlay_Gerber.zip Демонстрационное видео на ЮТУБ: http://www.youtube.com/watch?v=ZCZwsP3rf8Y