Como transformar um GPIO em sua função alternativa?


9

Eu quero usar a função altenate do GPIO 4, ou seja, a função GPCLK0. Como se pode definir um GPIO para sua função alternativa? Muitas funções alternativas estão resumidas aqui: elinux-wiki

O melhor seria se fosse possível com a fiaçãoPi Library . Mas eu não me importo de usar código C arbitrário se alguém me disser como fazê-lo. Depois de inserir uma função alternativa, acho que é necessário configurá-la?

Respostas:


3

Você pode usar a seguinte macro C para alterar um determinado GPIO para uma função alternativa, conforme especificado nesta tabela: http://elinux.org/RPi_BCM2835_GPIOs

volatile unsigned *gpio;

#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))

Exemplo (de http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking )

As macros C a seguir alterariam o GPIO g para sua função ALT0:

INP_GPIO(g);
SET_GPIO_ALT(g,0);

Sempre use INP_GPIO (x) antes de usar SET_GPIO_ALT (x, y)

#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))

3
Uau. Essa primeira macro é ... inacreditável. Você se importaria de explicar como isso funciona?
fouric

0

Aqui estão alguns outros tópicos (em www.raspberrypi.org ) que estão lidando com a GPCLK0função.

o segundo link tem um exemplo C exato de como definir a função alternativa GPCLK0.

/* Setup GPIO 4 as ALT0 function i.e. GPCLK0 */
mov r0, #4
mov r1, #4 /* ALT0 */

Obrigado por essa resposta, eu tentei um pouco com esse código assembler, mas acho que assembler não é o meu problema. Isso leva mais tempo do que o esperado ..
user61664 4/11/12


0

Use este código para definir a função alt

static void bcm2708_set_gpio_alt(int pin, int alt)
{
    /*
     * This is the common way to handle the GPIO pins for
     * the Raspberry Pi.
     * TODO This is a hack. Use pinmux / pinctrl.
     */
#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)        <<(((g)%10)*3))
    unsigned int *gpio;
    gpio = ioremap(GPIO_BASE, SZ_16K);
    INP_GPIO(pin);
    SET_GPIO_ALT(pin, alt);
    iounmap(gpio);
#undef INP_GPIO
#undef SET_GPIO_ALT
}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.