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

Allwinner T113-s3 уделал HiFi4 DSP. Смеяться или плакать?

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

Partitions ещё. У мкня больше разнообразия - в виде usb

Так у меня вообще 4 диска,  сд карта, рам диск, усб флеш и ром диск, который в spi nand.

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

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


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

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

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


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

Вопрос про 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);

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

 

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


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

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

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


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

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

здесь посмотрите

Отсюда и взял как пример...

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


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

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();
}

 

 

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

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


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

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Мбайт\с .

Изменено пользователем _Евген_

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


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

17 часов назад, nanorobot сказал:

когда то занимался, точно не помню, что и как -TP_UP_PENDING, TP_DOWN_PENDING чтением не сбрасываются - может они...? TP_IDLE_FLAG тоже настораживает ..

Да сам затупил из-за большого кол-ва оберток в исходнике, ненавижу обертки))) Там при сбросе флагов в обертке уже было прибавлено смещение к базовому адресу, а я еще раз прибавлял)))

Кстати АЦП там довольно удобный, он автоматически переключает каналы и цифрует, в обработчике только надо проверять с какого канала данные и класть в соотв. ячейку, в АВРке приходилось переключать каналы вручную после измерения... На счет точности пока не очень, но я использовал "цифровое" питание, потом попробую через LDOшку...

 

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

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


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

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й не реагирует вообще.

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

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


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

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

 

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

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


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

Rotate g2d умеет... ничено похожего на компоненты bld и wb не нашёл... я так понял намёк на бинарник? Тогда хоть намекните еще где их базовые адреса/смещения искать....

Кстати, в overviev g2d эти пункты про работу с изображением акуратно убраны.

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

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


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

#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 должен быть. Есть там что-то, кроме нулей?

image.thumb.png.342bc7345dbe2da28769501c7c519a8e.png

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

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


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

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

ничено похожего на компоненты bld и wb не нашёл..

Странно с одной стороны, т.е. если я аппаратно жпег декодирую, то vuw в rgb должен программно? Ну тупо же)))

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


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

В 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 работать на землю(без внешней подтяжки или инвертора)?

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


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

 

37 minutes ago, mantech said:

Странно с одной стороны, т.е. если я аппаратно жпег декодирую, то vuw в rgb должен программно? Ну тупо же)))

Для отображения с этой перекодировкой вполне DE справится

 

30 minutes ago, _Евген_ said:

Кто может подсказать, что я упустил

Т113. Прерывания начинают работат, если альтернативеой функцией входа сделаете "внешнее прерывание", а не просто вход. Чтение сочтояния пинов сохранится.

Прдтяхк работают

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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