#include <stdio.h>
#include <rpi_gpio.h>
#include "l293d_driver.h"

/* BCM numbering */
#define L293D_EN   22  /* L293D Pin 1  Enable */
#define L293D_IN1  27  /* L293D Pin 2  Input 1 */
#define L293D_IN2  17  /* L293D Pin 7  Input 2 */

int l293d_init(void)
{
    int ret;

    ret = rpi_gpio_setup(L293D_EN, GPIO_OUT);
    if (ret != GPIO_SUCCESS) {
        printf("rpi_gpio_setup failed: EN ret=%d\n", ret);
        return ret;
    }

    ret = rpi_gpio_setup(L293D_IN1, GPIO_OUT);
    if (ret != GPIO_SUCCESS) {
        printf("rpi_gpio_setup failed: IN1 ret=%d\n", ret);
        return ret;
    }

    ret = rpi_gpio_setup(L293D_IN2, GPIO_OUT);
    if (ret != GPIO_SUCCESS) {
        printf("rpi_gpio_setup failed: IN2 ret=%d\n", ret);
        return ret;
    }

    l293d_stop();
    return GPIO_SUCCESS;
}

void l293d_forward(void)
{
    rpi_gpio_output(L293D_IN1, GPIO_HIGH);
    rpi_gpio_output(L293D_IN2, GPIO_LOW);
}

void l293d_enable(void)
{
    l293d_forward();
    rpi_gpio_output(L293D_EN, GPIO_HIGH);
}

void l293d_disable(void)
{
    rpi_gpio_output(L293D_EN, GPIO_LOW);
}

void l293d_stop(void)
{
    rpi_gpio_output(L293D_EN, GPIO_LOW);
    rpi_gpio_output(L293D_IN1, GPIO_LOW);
    rpi_gpio_output(L293D_IN2, GPIO_LOW);
}

void l293d_cleanup(void)
{
    l293d_stop();
    rpi_gpio_cleanup();
}
 
<l293d_driver.h>

#ifndef L293D_DRIVER_H
#define L293D_DRIVER_H

int  l293d_init(void);
void l293d_forward(void);
void l293d_enable(void);
void l293d_disable(void);
void l293d_stop(void);
void l293d_cleanup(void);

#endif /* L293D_DRIVER_H */