Jump to content

    

Загрузка LDR из уже загруженной программы BF537

Доброго дня. Процессор BF537. Стоит задача грузить разные LDRы в зависимости от некоторых условий. Флеш память подключена на прямую к шине. Во флеш записан LDR, который должна грузить программа. LDR формирую с параметрами Binary, 16-bit. Во флеш LDR попадает, проверенно вычитыванием из флеша.  

Распарсил LDR в соответствие с его структурой.  Происходит выброс исключения при попытке записи блока LDR в адрес 0xffa00000.

unsigned char *flashP;	
	flashP = (unsigned char *)0x20000000;
	unsigned int targetAddress;
	unsigned int count;
	unsigned short flag;
		
	do
	{
		memcpy(&targetAddress, flashP, sizeof(targetAddress));
		memcpy(&count, flashP + sizeof(targetAddress), sizeof(count));
		memcpy(&flag, flashP + sizeof(targetAddress) + sizeof(count), sizeof(flag));		
		if (flag & BFLAG_53X_IGNORE)
		{
			flashP += sizeof(targetAddress) + sizeof(count) + sizeof(flag) + count;	
			continue;
		}		
		if ( !(flag & BFLAG_53X_ZEROFILL))		
		{			
			if (targetAddress >= 0xFFA00000)
				asm("nop;");
			memcpy((void *)targetAddress, flashP + sizeof(targetAddress) + sizeof(count) + sizeof(flag), count);
			flashP += sizeof(targetAddress) + sizeof(count) + sizeof(flag) + count;	
		}
		else
		{
			memset((void *)targetAddress, 0x00, count);
			flashP += sizeof(targetAddress) + sizeof(count) + sizeof(flag);
		}		
	} while ( !(flag & BFLAG_53X_FINAL));
	asm("nop;");
	asm("P5.H = 0xffa0;");
 	asm("P5.L = 0x0000;");
 	asm("jump(p5);");
 	asm("nop;");


  

Share this post


Link to post
Share on other sites

Я это делаю средствами встроенного загрузчика в BF533. Может быть в каком-то месте ошибусь, делал это лет 5 назад.

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

Программы у меня хранятся в SPI флешке. Когда нужно перейти из одной программы в другую я формирую ресет. Перед этим записываю в регистр UART scratch (вроде так называется регистр) номер программы которую нужно загрузить. Этот регистр не меняет содержимое после сброса. После сброса проц начинает грузить бут написанный на ассемблере, там проверяется содержимое регистра UART и исходы из этого подсовывается адрес откуда грузить LDR. Этот адрес уже передается во встроенный в процессор бут и он занимается загрузкой LDR. Если нужны детали поищу исходники.

 

 

Share this post


Link to post
Share on other sites

uriy дело говорит. Сам таким занимался на ADSP-21xx, теперь и на BF. Используйте встроенный в BF загрузчик.

Edited by kv193

Share this post


Link to post
Share on other sites

Спасибо. Действительно у блекфина есть встроенный загрузчик в постоянной памяти. Вроде разобрался, но появилась другая проблема. делаю так. 

	asm("P0.H = HI(0xEF000008 );");	
	asm("P0.L = LO(0xEF000008 ) ;");			
	asm("R7.H = HI(0x20000000) ; ");       
	asm("R7.L = LO(0x20000000) ;");
	asm("JUMP (P0);");

Когда гружу основную программу через jtag, все ок, основная программа грузит LDR с адреса 0x20000000. Проблема возникает когда работаю без программатора. U-Boot грузить основную программу . Основная программа в свою очередь должна загрузить нужный LDR, но этого не происходит. Я предполагаю, что для загрузки LDR нужно быть в режиме супервизера.

Share this post


Link to post
Share on other sites

Ну тогда раз у вас u-boot я бы перед перезагрузкой менял переменную окружения bootcmd в которой указано откуда грузить программу.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now