mantech 53 20 августа Опубликовано 20 августа (изменено) · Жалоба 2 часа назад, GenaSPB сказал: Partitions ещё. У мкня больше разнообразия - в виде usb Так у меня вообще 4 диска, сд карта, рам диск, усб флеш и ром диск, который в spi nand. Изменено 20 августа пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ozelot 9 21 августа Опубликовано 21 августа · Жалоба On 8/20/2024 at 8:17 AM, _Евген_ said: Согласен, цифры соблазнительные, но мне флешку в корпус не впихнуть. А лишние отверстия увеличат риск попадания воды. Я правильно Вас понял, что общим решением кратного роста пропускной способности fatfs в обоих случаях, является увеличение размера кластера(под windows(10RUS) -> форматировать -> Размер единицы распределения)? Но как быть с ограниченным списком MIN 512 ... MAX 4096 в fatfs/ffconf.h(Пишу по памяти): при попытке увеличить в fatfs/ffconf.h значение MAX c 4096 на значения выше при сборке были ошибки на "#if" в коде Я не имел ввиду, что нужно использовать usb-накопитель. Эту ссылку я дал только для того, чтобы вы не поленились найти в ней механизм записи файлов в fatfs порциями большого размера: https://github.com/minilogic/f1c_nonos/blob/main/src/usbh/msc/main.c#L22 Как инициализировать накопитель на карте памяти можно увидеть, например тут: https://github.com/minilogic/f1c_nonos/blob/main/src/audio/mp3recorder/main.c#L54 Ну и самое главное, чтобы функция записи на карту памяти поддерживала мультиблочную запись: https://github.com/minilogic/f1c_nonos/blob/main/drv/sd.c#L200 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 21 августа Опубликовано 21 августа · Жалоба Вопрос про TPADC с прерываниями. Может знает кто, что еще нужно сделать в обработчике прерываний, чтобы он не зависал, т.е. постоянно генерировал прерывания. Делал как в примере static void sunxi_tpadc_clear_pending(unsigned long reg_base) { int reg; reg = readl(reg_base + TP_INT_FIFOS); writel(reg, reg_base + TP_INT_FIFOS); } В обработчике читаю данные и выполняю вышеуказанную функцию, которая сбрасывает биты в регистре статуса. Нужно что-то еще сбрасывать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 21 августа Опубликовано 21 августа · Жалоба 22 minutes ago, mantech said: Вопрос про TPADC с прерываниями. Может знает кто, что еще нужно сделать в обработчике прерываний, чтобы он не зависал, т.е. постоянно генерировал прерывания. Делал как в примере static void sunxi_tpadc_clear_pending(unsigned long reg_base) { int reg; reg = readl(reg_base + TP_INT_FIFOS); writel(reg, reg_base + TP_INT_FIFOS); } В обработчике читаю данные и выполняю вышеуказанную функцию, которая сбрасывает биты в регистре статуса. Нужно что-то еще сбрасывать? когда то занимался, точно не помню, что и как -TP_UP_PENDING, TP_DOWN_PENDING чтением не сбрасываются - может они...? TP_IDLE_FLAG тоже настораживает .. здесь посмотрите https://github.com/RT-Thread/rt-thread/blob/master/bsp/allwinner/libraries/sunxi-hal/hal/source/tpadc/hal_tpadc.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 21 августа Опубликовано 21 августа · Жалоба 1 час назад, nanorobot сказал: здесь посмотрите Отсюда и взял как пример... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vasilius 1 21 августа Опубликовано 21 августа (изменено) · Жалоба 6 часов назад, Ozelot сказал: Я не имел ввиду, что нужно использовать usb-накопитель. Эту ссылку я дал только для того, чтобы вы не поленились найти в ней механизм записи файлов в fatfs порциями большого размера: https://github.com/minilogic/f1c_nonos/blob/main/src/usbh/msc/main.c#L22 Как инициализировать накопитель на карте памяти можно увидеть, например тут: https://github.com/minilogic/f1c_nonos/blob/main/src/audio/mp3recorder/main.c#L54 Ну и самое главное, чтобы функция записи на карту памяти поддерживала мультиблочную запись: https://github.com/minilogic/f1c_nonos/blob/main/drv/sd.c#L200 Я давно игрался... но вроде все нормально обрабатывалось... вот нашел ... Спойлер /* * tpadc.c * * Created on: 10 янв. 2024 г. * Author: Owner */ #include "tpadc.h" #include "nanoprintf.h" TPoint pointsTest[5]; TPoint pointsADC[5]; TFactors factors; volatile TPoint touchXY; void FactorsCalc(TPoint *s, TPoint *t, TFactors *factors, uint8_t count) { // https://www.ti.com/lit/an/slyt277/slyt277.pdf float a = 0, b = 0, c = 0, d = 0, e = 0, X1 = 0, X2 = 0, X3 = 0, Y1 = 0, Y2 = 0, Y3 = 0; float D, Dx1, Dx2, Dx3, Dy1, Dy2, Dy3; float n = (float) count * 1.0f; for(uint8_t j = 0; j < count; j++) { a += t[j].X * t[j].X; b += t[j].Y * t[j].Y; c += t[j].X * t[j].Y; d += t[j].X; e += t[j].Y; X1 += t[j].X * s[j].X; X2 += t[j].Y * s[j].X; X3 += s[j].X; Y1 += t[j].X * s[j].Y; Y2 += t[j].Y * s[j].Y; Y3 += s[j].Y; } D = n * (a * b - c * c) + 2.0f * c * d * e - a * e * e - b * d * d; Dx1 = n * (X1 * b - X2 * c) + e * (X2 * d - X1 * e) + X3 * (c * e - b * d); Dx2 = n * (X2 * a - X1 * c) + d * (X1 * e - X2 * d) + X3 * (c * d - a * e); Dx3 = X3 * (a * b - c * c) + X1 * (c * e - b * d) + X2 * (c * d - a * e); Dy1 = n * (Y1 * b - Y2 * c) + e * (Y2 * d - Y1 * e) + Y3 * (c * e - b * d); Dy2 = n * (Y2 * a - Y1 * c) + d * (Y1 * e - Y2 * d) + Y3 * (c * d - a * e); Dy3 = Y3 * (a * b - c * c) + Y1 * (c * e - b * d) + Y2 * (c * d - a * e); factors->aX = (float) ( Dx1 / D); factors->bX = (float) ( Dx2 / D); factors->dX = (float) ( Dx3 / D); factors->aY = (float) ( Dy1 / D); factors->bY = (float) ( Dy2 / D); factors->dY = (float) ( Dy3 / D); } void Correction(TPoint *corrected, TPoint *adc, TFactors *factors) { corrected->X = (int32_t) (factors->aX * adc->X + factors->bX * adc->Y + factors->dX); corrected->Y = (int32_t) (factors->aY * adc->X + factors->bY * adc->Y + factors->dY); } __WEAK void TPADC_IRQHandler(void) { TPoint adc, res; const uint32_t status = TPADC->TP_INT_FIFO_STAT_REG; TPADC->TP_INT_FIFO_STAT_REG = status; // clear the pending status. uint32_t rxData = (status >> 8) & 0x3F; uint32_t xD, yD, xU, yU; if ( ((status & 0xF) == 2) && rxData ) // if ( ((status & 0xF) == 4) && rxData ) { uart_print("\n\r RXA_START="); u32touart0(( status >> 8) & 0x3F); uart_print(" "); u32touart0( status); while ( (TPADC->TP_INT_FIFO_STAT_REG >> 8) & 0x3F ) { yU = TPADC->TP_DATA_REG; xU = TPADC->TP_DATA_REG; } adc.X = xU; adc.Y = yU; Correction(&res, &adc, &factors); xD = res.X; yD = res.Y; npf_pprintf(&uart0_putc, NULL, "\n\r x=%u y=%u", xD, yD ); npf_pprintf(&uart0_putc, NULL, "\n\r x=%u y=%u \n", xU, yU); } } __WEAK void TPADC_InitTP(void) { CCU_SetTPADC(CCU_TPADC_SRC_HOSC); TPADC->TP_CTRL_REG0 = (0x0F << 24) | // ADC_FIRST_DLY (0x01 << 23) | // ADC_FIRST_DLY_MODE (0x03 << 20) | // ADC_CLK_DIVIDER /1 (0x0B << 16) | // FS_DIV (0x02 << 0) | // TACQ 0; TPADC->TP_CTRL_REG1 = (0x0B << 12) | // STYLUS_UP_DEBOUNCE (0x00 << 9) | // STYLUS_UP_DEBOUCE_EN (0x01 << 8) | // CHOPPER_EN (0x00 << 6) | // TP_DUAL_EN (0x01 << 5) | // TP_EN (0x00 << 4) | // TP_MODE_SELECT (0x00 << 3) | // ADC_CHAN3_SELECT (0x00 << 2) | // ADC_CHAN2_SELECT (0x00 << 1) | // ADC_CHAN1_SELECT (0x00 << 0) | // ADC_CHAN0_SELECT 0; TPADC->TP_CTRL_REG2 = (0xF << 28) | // TP_SENSITIVE_ADJUST (0x0 << 26) | // TP_FIFO_MODE_SELECT (0x1 << 24) | // PRE_MEA_EN (0x1FFF << 0) | // PRE_MEA_THRE_CNT 0; TPADC->TP_CTRL_REG3 = (0x01 << 2) | // FILTER_EN (0x00 << 1) | // FILTER_TYPE 01: 5/3 0; TPADC->TP_INT_FIFO_CTRL_REG = (0x00 << 17) | // TP_OVERRUN_IRQ_EN (0x01 << 16) | // TP_DATA_IRQ_EN (0x00 << 13) | // TP_DATA_XY_CHANGE (0x01 << 8) | // TP_FIFO_TRIG_LEVEL (0x00 << 7) | // TP_DATA_DRQ_EN (0x00 << 4) | // TP_FIFO_FLUSH (0x00 << 1) | // TP_UP_IRQ_EN (0x00 << 0) | // TP_DOWN_IRQ_EN 0; SetHandlerIRQ(TPADC_IRQn, TPADC_IRQHandler, PRI_SYS, 0); pointsTest[0].X = 400; pointsTest[0].Y = 240; pointsTest[1].X = 40; pointsTest[1].Y = 440; pointsTest[2].X = 760; pointsTest[2].Y = 440; pointsTest[3].X = 760; pointsTest[3].Y = 40; pointsTest[4].X = 40; pointsTest[4].Y = 40; pointsADC[0].X = 2132; pointsADC[0].Y = 866; pointsADC[1].X = 1733; pointsADC[1].Y = 1036; pointsADC[2].X = 2660; pointsADC[2].Y = 2045; pointsADC[3].X = 2652; pointsADC[3].Y = 494; pointsADC[4].X = 1565; pointsADC[4].Y = 482; FactorsCalc(&pointsTest[0], &pointsADC[0], &factors, 5); // TPADC_FlushFIFO(); // uart_print("\n\r TP_CTRL_REG0="); u32touart0(TPADC->TP_CTRL_REG0); // uart_print("\n\r TP_CTRL_REG1="); u32touart0(TPADC->TP_CTRL_REG1); // uart_print("\n\r TP_CTRL_REG2="); u32touart0(TPADC->TP_CTRL_REG2); // uart_print("\n\r TP_CTRL_REG3="); u32touart0(TPADC->TP_CTRL_REG3); // uart_print("\n\r TP_INT_FIFO_CTRL_REG="); u32touart0(TPADC->TP_INT_FIFO_CTRL_REG); // uart_print("\n\r TP_CALI_DATA_REG="); u32touart0(TPADC->TP_CALI_DATA_REG); // BIT_SET(TPADC->TP_CTRL_REG1, 8); // Set CHOPPER_EN // BIT_CLEAR(TPADC->TP_CTRL_REG1, 4); // Set TP Mode // BIT_SET(TPADC->TP_CTRL_REG1, 0); // Set ADC_CHAN0_SELECT // BIT_SET(TPADC->TP_CTRL_REG1, 2); // Set ADC_CHAN2_SELECT // BIT_SET(TPADC->TP_CTRL_REG1, 5); // Set TP_EN // TPADC->TP_CTRL_REG2 = 0xF1800FFF; // Default // TPADC->TP_CTRL_REG3 = 5; // Set FILTER_EN + TYpe 5/3 // TPADC->TP_INT_FIFO_CTRL_REG = (0x1 << 8); // TP_FIFO_TRIG_LEVEL = 3 // BIT_SET(TPADC->TP_INT_FIFO_CTRL_REG, 17); // TP_OVERRUN_IRQ_EN // BIT_SET(TPADC->TP_INT_FIFO_CTRL_REG, 16); // TP_DATA_IRQ_EN // BIT_CLEAR(TPADC->TP_INT_FIFO_CTRL_REG, 13); // TP_DATA_XY_CHANGE // BIT_SET(TPADC->TP_INT_FIFO_CTRL_REG, 7); // TP_DATA_DRQ_EN // BIT_SET(TPADC->TP_INT_FIFO_CTRL_REG, 1); // TP_UP_IRQ_EN // BIT_SET(TPADC->TP_INT_FIFO_CTRL_REG, 0); // TP_DOWN_IRQ_EN } void TPADC_Calibration(void) { BIT_SET(TPADC->TP_CTRL_REG1, 7); // 1: Start calibration, it is cleared to 0 after calibration while (BIT_GET(TPADC->TP_CTRL_REG1, 7)) __NOP(); } void TPADC_FlushFIFO(void) { BIT_SET(TPADC->TP_INT_FIFO_CTRL_REG, 4); // Write ‘1’ to flush TX FIFO, self clear to ‘0’ while (BIT_GET(TPADC->TP_INT_FIFO_CTRL_REG, 4)) __NOP(); } Изменено 21 августа пользователем vasilius Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Евген_ 1 21 августа Опубликовано 21 августа (изменено) · Жалоба 8 часов назад, Ozelot сказал: Я не имел ввиду, что нужно использовать usb-накопитель. Эту ссылку я дал только для того, чтобы вы не поленились найти в ней механизм записи файлов в fatfs порциями большого размера: https://github.com/minilogic/f1c_nonos/blob/main/src/usbh/msc/main.c#L22 Как инициализировать накопитель на карте памяти можно увидеть, например тут: https://github.com/minilogic/f1c_nonos/blob/main/src/audio/mp3recorder/main.c#L54 Ну и самое главное, чтобы функция записи на карту памяти поддерживала мультиблочную запись: https://github.com/minilogic/f1c_nonos/blob/main/drv/sd.c#L200 Форумчане, всем спасибо, что откликнулись! Но четвертый день с 39град лежу - "горшочек" не то, что техническую, обычную информацию плохо переваривает. Но я обязательно все изучу позже и даже ради спортивного интереса получить эти магические 5Мбайт\с . Изменено 21 августа пользователем _Евген_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 22 августа Опубликовано 22 августа (изменено) · Жалоба 17 часов назад, nanorobot сказал: когда то занимался, точно не помню, что и как -TP_UP_PENDING, TP_DOWN_PENDING чтением не сбрасываются - может они...? TP_IDLE_FLAG тоже настораживает .. Да сам затупил из-за большого кол-ва оберток в исходнике, ненавижу обертки))) Там при сбросе флагов в обертке уже было прибавлено смещение к базовому адресу, а я еще раз прибавлял))) Кстати АЦП там довольно удобный, он автоматически переключает каналы и цифрует, в обработчике только надо проверять с какого канала данные и класть в соотв. ячейку, в АВРке приходилось переключать каналы вручную после измерения... На счет точности пока не очень, но я использовал "цифровое" питание, потом попробую через LDOшку... Изменено 22 августа пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 22 августа Опубликовано 22 августа (изменено) · Жалоба 10 часов назад, mantech сказал: Кстати АЦП там довольно удобный Протестировал с питанием от LDO на том же модуле на 1.8В При усреднении 1 к 8 , т.е. 8 отсчетов суммируются и делятся на 8. получается вполне неплохо, +-1.5 разряда, на 12 битах результате, но есть один минус - есть зависимость 1го и 3го канала от изменения напряжения на 0м или 2м, небольшая, +-5 единиц. Т.е. на 0м ноль, на 1м - 300, увеличиваю напряжение на 0м до максимума (1.8В) на первом становится 305. Предполагаю, переток по обходным цепям внутри чипа, он все-таки для тачпанели был разработан, там всякие ключи и пр, через них утекает. Если кто знает другую причину - отпишитесь... Проверял на неск. платах, если что, поведение одинаковое. Причем обратной зависимости нет, если меняю напряжение на 1м, 0й не реагирует вообще. Изменено 22 августа пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 25 августа Опубликовано 25 августа (изменено) · Жалоба On 5/14/2024 at 1:32 PM, GenaSPB said: Мне бы прямоугольник заполнить цветом... On 5/14/2024 at 2:47 PM, GenaSPB said: On 5/14/2024 at 2:27 PM, mantech said: А зачем для этого ГПУ? G2d в t507 не способен на такое... мне кажется вы ошибаетесь Quote Allwinner H616 (sun50iw9p1) https://linux-sunxi.org/H616 Quote g2d_sunxi-${CONFIG_ARCH_SUN50IW9P1} += g2d_driver.o g2d_bsp_v2.o Quote __s32 g2d_fillrectangle(g2d_image_enh *dst, __u32 color_value) https://github.com/Tina-Linux/linux-5.4/blob/ff6b1361f7041be75d4486559141e13134d164ef/drivers/char/sunxi_g2d/g2d_bsp_v2.c#L1464 Изменено 25 августа пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 25 августа Опубликовано 25 августа (изменено) · Жалоба Rotate g2d умеет... ничено похожего на компоненты bld и wb не нашёл... я так понял намёк на бинарник? Тогда хоть намекните еще где их базовые адреса/смещения искать.... Кстати, в overviev g2d эти пункты про работу с изображением акуратно убраны. Изменено 25 августа пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 25 августа Опубликовано 25 августа (изменено) · Жалоба #define G2D_TOP (0x00000) #define G2D_MIXER (0x00100) #define G2D_BLD (0x00400) #define G2D_V0 (0x00800) #define G2D_UI0 (0x01000) #define G2D_UI1 (0x01800) #define G2D_UI2 (0x02000) #define G2D_WB (0x03000) #define G2D_VSU (0x08000) #define G2D_ROT (0x28000) #define G2D_GSU (0x30000) Есть только TOP и ROT (кстати, RCU метод управления работает только в T113). У кого есть работча система на H616/H507, распечатайте память с 0x01480400 - 256 байт, не более - это BLD должен быть. Есть там что-то, кроме нулей? Изменено 25 августа пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 25 августа Опубликовано 25 августа · Жалоба 2 часа назад, GenaSPB сказал: ничено похожего на компоненты bld и wb не нашёл.. Странно с одной стороны, т.е. если я аппаратно жпег декодирую, то vuw в rgb должен программно? Ну тупо же))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Евген_ 1 25 августа Опубликовано 25 августа · Жалоба В 21.08.2024 в 14:07, Ozelot сказал: Я не имел ввиду, что нужно использовать usb-накопитель. Эту ссылку я дал только для того, чтобы вы не поленились найти в ней механизм записи файлов в fatfs порциями большого размера: https://github.com/minilogic/f1c_nonos/blob/main/src/usbh/msc/main.c#L22 Как инициализировать накопитель на карте памяти можно увидеть, например тут: https://github.com/minilogic/f1c_nonos/blob/main/src/audio/mp3recorder/main.c#L54 Ну и самое главное, чтобы функция записи на карту памяти поддерживала мультиблочную запись: https://github.com/minilogic/f1c_nonos/blob/main/drv/sd.c#L200 @OzelotСпасибо за ссылки! Потихоньку возвращаюсь в строй: добавил промежуточный буфер и запись(f_write) по 4k(32к пока не стал): 64k данных записываются за 20мс -> при 50% качестве сжатия 576p успешно записываются на SD-карту c 25 к/сек Решил добавить обработку детектора движения (gpio A1) по прерыванию: gpio_pin_init(GPIOA, 1, GPIO_MODE_INPUT , GPIO_PULL_DOWN , GPIO_DRV_0); <- корректно работает(gpio_pin_get) только при замыканию на +3.3(даже с GPIO_PULL_UP): пришлось ставить инвертор eint_pin_init(GPIOA, 1,EINT_TRG_RISING); eint_pin_enable(GPIOA, 1); eint_debounce_config(GPIOA,EINT_DEB_SRC_HOSC,EINT_DEB_DIV_1); При этом: gpio_pin_get(GPIOA, 1) отображает изменение состояния (0 - нет замыкания, 1 - замыкание на +3.3). eint_pin_get_status(GPIOA, 1) не меняет состояния совсем (всегда 0) Такое ощущение, что забыл включить какое-то тактирование или что-то подобное. Кто может подсказать, что я упустил(чтобы при изменении состояния на входе, бит в GPIO_INT_STA менялся), а так же может ли вход с PULL_UP работать на землю(без внешней подтяжки или инвертора)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 25 августа Опубликовано 25 августа (изменено) · Жалоба 37 minutes ago, mantech said: Странно с одной стороны, т.е. если я аппаратно жпег декодирую, то vuw в rgb должен программно? Ну тупо же))) Для отображения с этой перекодировкой вполне DE справится 30 minutes ago, _Евген_ said: Кто может подсказать, что я упустил Т113. Прерывания начинают работат, если альтернативеой функцией входа сделаете "внешнее прерывание", а не просто вход. Чтение сочтояния пинов сохранится. Прдтяхк работают Изменено 25 августа пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться