[U-Boot] Fwd: Running C program in U-BOOT

Light King thelightking at gmail.com
Sat Sep 20 11:03:04 CEST 2008


---------- Forwarded message ----------
From: Light King <thelightking at gmail.com>
Date: Sep 20, 2008 2:27 PM
Subject: Running C program in U-BOOT
To: u-boot-users at lists.sourceforge.net

Dear All ,

I m running following code in the U-BOOT but it is not behaving as a C code
. My processor is AT91SAM9263 . This code is to run a ADC present in my
board .

After compiling when I m running this code executable in the board it is not
starting from main function but starting from
pio_set_B_periph function . Can any one help me what is wrong happening here
?



CODE *********************************>>>>>>>>>>>>>>>

#include "AT91SAM9263_inc.h"

#include "gpio.h"



#define writel(value, address) \

(*(volatile unsigned int *)(address)) = (value)

#define readl(address) \

(*(volatile unsigned int *)(address))

//#define EINVAL 1 /* Error code returned when the PIN is unknown */

/* Write PIO register */

static inline void write_pio(unsigned int offset, const unsigned int value)

{

writel(value, offset + AT91C_BASE_PIOA);

}

/* Read PIO registers */

static inline unsigned int read_pio(volatile unsigned int offset)

{

return readl(offset + AT91C_BASE_PIOA);

}



static inline int pio_set_B_periph(unsigned pin, int use_pullup)

{

unsigned pio = ((pin) / PIO_NB_IO);

unsigned mask = (1 << ((pin) % PIO_NB_IO));

//if (pio >= AT91C_NR_PIO)

// return -EINVAL;

write_pio(PIO_IDR(pio), mask);

write_pio((use_pullup ? PIO_PPUER(pio) : PIO_PPUDR(pio)), mask);

write_pio(PIO_BSR(pio), mask);

write_pio(PIO_PDR(pio), mask);

return 0;

}



static inline int pio_set_gpio_input(unsigned pin, int use_pullup)

{

unsigned pio = ((pin) / PIO_NB_IO);

unsigned mask = (1 << ((pin) % PIO_NB_IO));

if (pio >= AT91C_NR_PIO)

return -EINVAL;

write_pio(PIO_IDR(pio), mask);

write_pio((use_pullup ? PIO_PPUER(pio) : PIO_PPUDR(pio)), mask);

write_pio(PIO_ODR(pio), mask);

write_pio(PIO_PER(pio), mask);

return 0;

}



static inline int pio_set_gpio_output(unsigned pin, int value)

{

unsigned pio = ((pin) / PIO_NB_IO);

unsigned mask = (1 << ((pin) % PIO_NB_IO));

//if (pio >= AT91C_NR_PIO)

// return -EINVAL;

write_pio(PIO_IDR(pio), mask);

write_pio(PIO_PPUDR(pio), mask);

write_pio((value ? PIO_SODR(pio) : PIO_CODR(pio)), mask);

write_pio(PIO_OER(pio), mask);

write_pio(PIO_PER(pio), mask);

return 0;

}



static inline int pio_set_value(unsigned pin, int value)

{

unsigned pio = ((pin) / PIO_NB_IO);

unsigned mask = (1 << ((pin) % PIO_NB_IO));

//if (pio >= AT91C_NR_PIO)

// return -EINVAL;

write_pio((value ? PIO_SODR(pio) : PIO_CODR(pio)), mask);

return 0;

}

static inline int pio_get_value(unsigned pin)

{

unsigned pio = ((pin) / PIO_NB_IO);

unsigned mask = (1 << ((pin) % PIO_NB_IO));

unsigned int pdsr;

//if (pio >= AT91C_NR_PIO)

// return -EINVAL;

pdsr = read_pio(PIO_PDSR(pio));

return (pdsr & mask) != 0;

}

main()

{

int i,j,*p,arr[12];

*p=arr;

printf("Setting the PIO as peripherals\n");

pio_set_B_periph(AT91C_PIN_PA(0),(PIO_DEFAULT & PIO_PULLUP) ? 1 : 0);

pio_set_B_periph(AT91C_PIN_PA(1),(PIO_DEFAULT & PIO_PULLUP) ? 1 : 0);

pio_set_B_periph(AT91C_PIN_PA(2),(PIO_DEFAULT & PIO_PULLUP) ? 1 : 0);

pio_set_B_periph(AT91C_PIN_PA(3),(PIO_DEFAULT & PIO_PULLUP) ? 1 : 0);



printf("Setting the PIO as i/p o/p \n");

pio_set_gpio_input(AT91C_PIN_PA(0),(PIO_DEFAULT & PIO_PULLUP) ? 1 : 0);

pio_set_gpio_output(AT91C_PIN_PA(1),PIO_DEFAULT );

pio_set_gpio_output(AT91C_PIN_PA(2),PIO_DEFAULT );

pio_set_gpio_output(AT91C_PIN_PA(3),PIO_DEFAULT );

printf("Loops for writng data and reading data to ADC\n");

pio_set_value(AT91C_PIN_PA(3),1);

pio_set_value(AT91C_PIN_PA(2),1);

for(i=0;i<6;i++);

pio_set_value(AT91C_PIN_PA(3),0);

pio_set_value(AT91C_PIN_PA(1),0);

pio_set_value(AT91C_PIN_PA(2),0);

for(i=0;i<9;i++);

pio_set_value(AT91C_PIN_PA(2),1);

for(i=0;i<9;i++);

p=((if(pio_get_value(AT91C_PIN_PA(0))==1))?1:0);

p++;

pio_set_value(AT91C_PIN_PA(1),1);

pio_set_value(AT91C_PIN_PA(2),0);

for(i=0;i<9;i++);

pio_set_value(AT91C_PIN_PA(2),1);

for(i=0;i<9;i++);

p=((if(pio_get_value(AT91C_PIN_PA(0))==1))?1:0);

p++;

for(j=1;j<=10;j++)

{

pio_set_value(AT91C_PIN_PA(2),0);

for(i=0;i<9;i++);

pio_set_value(AT91C_PIN_PA(2),1);

for(i=0;i<9;i++);

p=((if(pio_get_value(AT91C_PIN_PA(0))==1))?1:0);

p++;

}

pio_set_value(AT91C_PIN_PA(3),1);

printf("digital value is %d",arr);

}


More information about the U-Boot mailing list