From: batt Date: Thu, 4 Sep 2008 15:19:48 +0000 (+0000) Subject: Add ft245rl usb to parallel converter driver. X-Git-Tag: 2.0.0~157 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=3fc368beb46bbaea22335bf33f323117c47e537b;p=bertos.git Add ft245rl usb to parallel converter driver. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1777 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/bertos/drv/ft245rl.c b/bertos/drv/ft245rl.c new file mode 100644 index 00000000..40ffe0fd --- /dev/null +++ b/bertos/drv/ft245rl.c @@ -0,0 +1,118 @@ +/** + * \file + * + * + * \brief Function library for Accessing FT245RL USB interface. + * + * This module handles USB communication with FT245RL chip. + * This chip is a parallel USB interface with data flow control. + * A kfile-like interface is supplied. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_ft245rl.h" +#include "ft245rl.h" + +#include +#include +#include +#include +#include + +#include + + +MOD_DEFINE(ft245rl); + +/** + * Read \a size bytes in buffer \a buf, from fid \a _fd. + */ +static size_t ft245rl_read(struct KFile *_fd, void *_buf, size_t size) +{ + Ft245rl *fd = FT245RL(_fd); + (void)fd; //unused + uint8_t *buf = (uint8_t *)_buf; + size_t total_read = 0; + + while (size--) + { + while(!FT245RL_DATA_RDY()) + /* busy waiy */; + + *buf++ = FT245RL_GETDATA(); + total_read++; + } + + return total_read; +} + +/** + * Write \a size bytes from buffer \a buf, of fid \a _fd. + */ +static size_t ft245rl_write(struct KFile *_fd, const void *_buf, size_t size) +{ + Ft245rl *fd = FT245RL(_fd); + (void)fd; //unused + const uint8_t *buf = (const uint8_t *)_buf; + size_t total_write = 0; + + while (size--) + { + while(!FT245RL_TX_ALLOWED()) + /* busy waiy */; + + FT245RL_SETDATA(*buf++); + total_write++; + } + + return total_write; +} + +/** + * Ft245rl init function. + */ +void ft245rl_init(Ft245rl *fd) +{ + memset(fd, 0, sizeof(*fd)); + DB(fd->fd._type = KFT_FT245RL); + + // Setup data ft245rl communication functions. + fd->fd.read = ft245rl_read; + fd->fd.write = ft245rl_write; + + FT245RL_INIT(); + while (FT245RL_DATA_RDY()) + FT245RL_GETDATA(); + + MOD_INIT(ft245rl); +} diff --git a/bertos/drv/ft245rl.h b/bertos/drv/ft245rl.h new file mode 100644 index 00000000..e120ab9c --- /dev/null +++ b/bertos/drv/ft245rl.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \brief Function library for Accessing FT245RL USB interface. + * + * + * \version $Id$ + * \author Francesco Sacchi + */ + + +#ifndef DRV_FT245RL_H +#define DRV_FT245RL_H + +#include +#include + +/** + * ID for FT245RL KFiles. + */ +#define KFT_FT245RL MAKE_ID('F', '2', '4', '5') + +/** + * Ft245rl KFile context structure. + */ +typedef struct Ft245rl +{ + KFile fd; ///< File descriptor. +} Ft245rl; + + +/** + * Convert + ASSERT from generic KFile to KFileFt245rl. + */ +INLINE Ft245rl * FT245RL(KFile *fd) +{ + ASSERT(fd->_type == KFT_FT245RL); + return (Ft245rl *)fd; +} + +void ft245rl_init(Ft245rl *fd); + +#endif /* DRV_FT245RL_H */ diff --git a/bertos/hw/hw_ft245rl.h b/bertos/hw/hw_ft245rl.h new file mode 100644 index 00000000..cc0c8193 --- /dev/null +++ b/bertos/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ +