[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