omap138使用u-boot加载ais格式app

来源:互联网 发布:最新最好听的网络歌曲 编辑:程序博客网 时间:2024/05/18 22:43
1、修改交叉编译工具:u-boot\arch\arm\config.mk文件中将#CROSS_COMPILE ?= arm-linux- 改为CROSS_COMPILE ?= arm-arago-linux-gnueabi-
2、添加uart0作为boot串口:在文件u-boot\board\davinci\da8xxevm\omapl138_lcdk.c添加/*UART0 pin muxer settings*/
static const struct pinmux_config uart0_pins[] = {
{ pinmux(3), 2, 6 },
{ pinmux(3), 2, 7 },
{ pinmux(3), 2, 4 },
{ pinmux(3), 2, 5 }
};


在pinmux_resource结构中添加PINMUX_ITEM(uart0_pins),
在lpsc_resource结构中添加{ DAVINCI_LPSC_UART0 },/* console */
int board_init(void)函数中writel(readl(&davinci_syscfg_regs->suspsrc) &
      ~(DAVINCI_SYSCFG_SUSPSRC_I2C |
DAVINCI_SYSCFG_SUSPSRC_SPI1 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 |
DAVINCI_SYSCFG_SUSPSRC_UART0|DAVINCI_SYSCFG_SUSPSRC_MCBSP1),
      &davinci_syscfg_regs->suspsrc);
       和writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
DAVINCI_UART_PWREMU_MGMT_UTRST),
      &davinci_uart0_ctrl_regs->pwremu_mgmt);
在u-boot\include\configs\omapl138_lcdk.h文件中  #define CONFIG_SYS_NS16550_COM1DAVINCI_UART0_BASE /* Base address of UART2 */     


3、修改u-boot的时钟源:u-boot\include\configs\omapl138_lcdk.h文件中修改#define CONFIG_SYS_OSCIN_FREQ20000000
4、修改环境变量的默认参数与命令行提示符:在u-boot\include\configs\omapl138_lcdk.h文件中修改#define CONFIG_SYS_PROMPT"PZ > " /* Command Prompt */
                #define CONFIG_BOOTCOMMAND "nand read 0xc0300000 0x500000 0x700000;nand read 0xc0a00000 0x300000 0x200000;bootm 0xc0a00000"
5、修改nandflash相关参数:在u-boot\drivers\mtd\nand\davinci_nand.c文件中修改#ifdef CONFIG_SYS_NAND_HW_ECC
nand->ecc.mode = NAND_ECC_HW;
nand->ecc.size = 2048;
nand->ecc.bytes = 16;

#if 1
.eccpos = {
24, 25, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59, 60, 61, 62, 63,
},
.oobfree = {
{.offset = 2, .length = 22, },
},
在文件u-boot\board\davinci\da8xxevm\omapl138_lcdk.c中修改writel((DAVINCI_ABCR_WSETUP(3) |
DAVINCI_ABCR_WSTROBE(15) |
DAVINCI_ABCR_WHOLD(1) |
DAVINCI_ABCR_RSETUP(3) |
DAVINCI_ABCR_RSTROBE(15) |
DAVINCI_ABCR_RHOLD(1) |
DAVINCI_ABCR_TA(1) |
DAVINCI_ABCR_ASIZE_16BIT),
      &davinci_emif_regs->ab2cr); /* CS3 */读写时序。
6、加载自定义的app的bin文件。在u-boot\common\cmd_bootm.c文件中重写函数
    #ifdef CONFIG_ARM_APP
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{

ulong       iflag;
ulong app_addr;
ulong       load_end = 0;
int     ret;
unsigned int *data;
uint32_t *fpga_data;
uint32_t    checksum = 0;

ulong cmd;
ulong arg;
ulong len;
ulong dst;
ulong src;
ulong   i;

#if 1
fpga_data = 0xc0300000;
// len = 1755229;
len = 658160;
FPGA_Config(fpga_data,len);
// puts ("arm_app debug");
#endif

void  (*app_entry)(void);
app_addr = simple_strtoul(argv[1], NULL, 16);
  //  printf ("*  kernel: cmdline image address = 0x%08lx\n", app_addr);
data = app_addr;
cmd = *data;
data++;
// puts ("arm_app debug");
// printf("the cmd is 0x%08lx\n",cmd);
cmd = *data;
while(0x58535906 != cmd)
{
if(0x5853590d == cmd)
{
data++;
arg = *data;
len = arg&0x0000ffff;
// printf("the 0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx\n",data[0],data[1],data[2],data[3],data[4],data[5]);
data = data+len+1;
// printf("the cmd is 0x%08lx,argc is%d\n",cmd,len);
cmd = *data;
// printf("the cmd is 0x%08lx\n",cmd);
}
else if(0x58535901 == cmd)
{
data++;
dst = *data;
data++;
len = *data;
data++;
src = data;
// printf("the cmd is 0x%08lx,dst is 0x%08lx,src is 0x%08lx,len is 0x%08lx\n",cmd,dst,data,len);
memcpy(dst,src,len);
data = data + len/4;
cmd = *data;
// printf("the cmd is 0x%08lx\n",cmd);
}
else
{
data++;
cmd = *data;
}
}
data++;
app_entry = *data;
// printf("the entry data is 0x%08lx,0x%08lx,0x%08lx,0x%08lx\n",data[0],data[1],data[2],data[3]);
// printf("the entry is 0x%08lx\n",app_entry);
app_entry();


}


7、用mcbsp来配置fpga程序:在u-boot\common\cmd_bootm.c文件的do_bootm函数中添加
#if 1
fpga_data = 0xc0300000;
// len = 1755229;
len = 658160;
FPGA_Config(fpga_data,len);
// puts ("arm_app debug");
#endif
 添加fpga的配置文件fpga.c
#include <asm/arch-davinci/hardware.h>
#include <linux/types.h>
#include <asm/arch-davinci/fpga.h>
#include <common.h>


//#define GPIO_CONFIG
#define MCBSP_CONFIG


#define GPDIR REG(0x01e26038)
#define GP_OUT REG(0x01e2603c)
#define GP_IN REG(0x01e26048)
#define SPCR REG(0x01D11008)
#define PCR REG(0x01D11024)
#define XCR REG(0x01D11010)
#define SRGR REG(0x01D11014)
#define DXR REG(0x01D11004)


 static void some_delay(u8 val)
{
u8 times = 0;
times = val;
while(times--)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
/************************************************************************/
/* 配置FPGA */
/************************************************************************/
void FPGA_Config(unsigned int *fpga_data,unsigned int len)
{
u32 i;
u32 k;


u32 temp;
u32 FLASH_Data;
u32 checksum = 0;
#if 0
for(i=0;i<len;i++)
{
checksum = checksum ^ fpga_data[i];
}
printf("fpga check sum 0x%08lx\n",checksum);
#endif
// printf("fpga_data[50] = 0x%08lx\n",fpga_data[50]);
// DCLK--MCBSP CLKX, DATA--MCBSP DX1, nConfig--GP0[11], nStatus--GP0[15], Conf_Done--GP0[14]
#ifdef MCBSP_CONFIG
REG(0x01C14124) = 0x02020200;//pinmux1 CLKX1 DX1
#endif
#ifdef GPIO_CONFIG
REG(0x01C14124) = 0x08000800;       //pinmux1 gp0[5]clk gp0[1]data
#endif
temp = REG(0x01E26014);
REG(0x01E26014) = temp | 0x00000800;    // nConfig = 1;
temp = REG(0x01E26010);
REG(0x01E26010) = temp & 0xFFFFF7FF;    //dir01 gp1[8] output;
temp = REG(0x01c14120);
REG(0x01c14120) = temp | 0x00080088;//pinmux0 gp0[11] gp0[14] gp0[15];
#ifdef MCBSP_CONFIG
// temp = REG(0x01E26010);
// REG(0x01E26010) = temp & 0xFEFFFFFF;//dir01 gp1[8] output;
#endif
#ifdef GPIO_CONFIG
temp = REG(0x01E26010);
REG(0x01E26010) = temp & 0xFEFFFFDD;    //dir01 gp0[1] gp0[5] gp1[8] output;
#endif
temp = REG(0x01E26010);
REG(0x01E26010) = temp | 0xC000;//dir6 gp0[14] gp0[15] input
/*MCBSP init*/
#ifdef MCBSP_CONFIG
SPCR &= ~(1<<23 |1<<22 | 1<<16 |1); // Disable FRST, GRST, XRST, RRST first.
PCR  = 0xF02; //clkxp = 1 falling edge data fsxp=0 high activity sclkme =0 
// printf("PCR  = 0x1F02;\n");
SRGR = 0x301f0005;
XCR  = 0xC00B0;
DXR = fpga_data[0];
#endif
temp = REG(0x01E26014);
REG(0x01E26014) = temp | 0x00000800;// nConfig = 1;
temp = REG(0x01E26014);
REG(0x01E26014) = temp & 0xFFFFFFDF;// DCLK = 0;
some_delay(100);

temp = REG(0x01E26014);// 开始进行配置
REG(0x01E26014) = temp & 0xFFFFF7FF; // nConfig = 0;  将nConfig拉低
some_delay(300);
// printf(" nConfig = 0;0x%08lx\n",REG(0x01E26014));
do 
{
temp = REG(0x01E26020);
}
while((temp&0xC000));// wait nStatus = 0 and Conf_done = 0
temp = REG(0x01E26014);
REG(0x01E26014) = temp | 0x00000800;// nConfig = 1; 将 nConfig拉高


some_delay(200);
do 
{
temp = REG(0x01E26020);
}
while(!(temp&0x8000));// wait nStatus = 1 gp6[6]
some_delay(100);
#ifdef MCBSP_CONFIG
SPCR |= (1 << 16 | 1<<23|1<<22); //Enable FRST clk
for (i=1; i<len; i++)// 配置数据
{
// asm("nop");
// asm("nop");
// asm("nop");
// asm("nop"); 
while(!(SPCR & (1<<17)));
DXR = fpga_data[i];
#endif
#ifdef GPIO_CONFIG
for (i=0; i<len; i++)               // 配置数据
{
FLASH_Data = fpga_data[i];
for (k=0; k<32; k++)
{
temp = (FLASH_Data>>k) & 0x1;

if (temp)
{
temp = REG(0x01E26014);
REG(0x01E26014) = temp | 0x00000002;
}
else
{
temp = REG(0x01E26014);
REG(0x01E26014) = temp & 0xFFFFFFFD;
}

temp = REG(0x01E26014);
REG(0x01E26014) = temp | 0x00000020;
asm("nop");
temp = REG(0x01E26014);
REG(0x01E26014) = temp & 0xFFFFFFDF;
}
#endif
}
do
    {
        temp = REG(0x01E26020);
    }
    while(!(temp&0x4000));                  // wait CONFIG_DONE = 1 gp0[14]
temp = REG(0x01E26010);
REG(0x01E26010) = temp & 0xFEFFFFDD;    //dir01 gp0[1] gp0[5] gp1[8] output;
SPCR &= ~(1 << 16 | 1<<23|1<<22);
REG(0x01C14124) = 0x08000800;
for (k=0; k<2; k++)
{
temp = REG(0x01E26014);
REG(0x01E26014) = temp | 0x00000020;
asm("nop");
temp = REG(0x01E26014);
REG(0x01E26014) = temp & 0xFFFFFFDF;
asm("nop");
}
some_delay(400);//完成配置到加载用户程序的延迟400us
#if 0
for (k=0; k<600; k++)// 继续提供若干个周期的时钟
{
#ifdef MCBSP_CONFIG
// asm("nop");
asm("nop");
asm("nop");
while(!(SPCR & (1<<17)));
DXR = 0xFFFFFFFF;
#endif
#ifdef GPIO_CONFIG
asm("nop");
asm("nop");
asm("nop");
temp = REG(0x01E26014);
REG(0x01E26014) = temp | 0x00000020;
asm("nop");

temp = REG(0x01E26014);
REG(0x01E26014) = temp & 0xFFFFFFDF;
asm("nop");
#endif
}
#ifdef MCBSP_CONFIG
temp = REG(0x01E26010);
REG(0x01E26010) = temp & 0xFEFFFFDD;    //dir01 gp0[1] gp0[5] gp1[8] output;


SPCR &= ~(1 << 16 | 1<<23|1<<22);
REG(0x01C14124) = 0x08000800;
#endif
#endif
}
在文件u-boot\board\davinci\da8xxevm\omapl138_lcdk.c中添加#define DAVINCI_SYSCFG_SUSPSRC_MCBSP1(1 << 8)
  static const struct lpsc_resource lpsc[] = {
{ DAVINCI_LPSC_AEMIF },/* NAND, NOR */
{ DAVINCI_LPSC_SPI1 },/* Serial Flash */
{ DAVINCI_LPSC_UART0 },/* console */
{ DAVINCI_LPSC_GPIO },
{ DAVINCI_LPSC_McBSP1 },
#ifdef CONFIG_DAVINCI_MMC
{ DAVINCI_LPSC_MMC_SD },
#endif
};
在函数int board_init(void)中添加 writel(readl(&davinci_syscfg_regs->suspsrc) &
      ~(DAVINCI_SYSCFG_SUSPSRC_I2C |
DAVINCI_SYSCFG_SUSPSRC_SPI1 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 |
DAVINCI_SYSCFG_SUSPSRC_UART0|DAVINCI_SYSCFG_SUSPSRC_MCBSP1),
      &davinci_syscfg_regs->suspsrc);
8、修改默认的加载时间:在文件u-boot\common\main.c中修改函数static __inline__ int abortboot(int bootdelay)
udelay(1000);
0 0
原创粉丝点击