diff options
| author | Uros Majstorovic <majstor@majstor.org> | 2025-02-13 18:33:42 +0100 | 
|---|---|---|
| committer | Uros Majstorovic <majstor@majstor.org> | 2025-02-13 18:33:42 +0100 | 
| commit | b74fe91ca04484567b10bb7f3136d39d5e2363d8 (patch) | |
| tree | 3874a0a207fe7f41ec925925bafab55d2c1139cb | |
| parent | 1aec91e5b3e5bb980f2029579bda36f306c9a000 (diff) | |
arducam driver moved to drv/
| -rw-r--r-- | fw/fe310/eos/dev/cam.c | 140 | ||||
| -rw-r--r-- | fw/fe310/eos/dev/cam.h | 88 | ||||
| -rw-r--r-- | fw/fe310/eos/dev/drv/arducam.c | 99 | ||||
| -rw-r--r-- | fw/fe310/eos/dev/drv/arducam.h | 8 | 
4 files changed, 107 insertions, 228 deletions
| diff --git a/fw/fe310/eos/dev/cam.c b/fw/fe310/eos/dev/cam.c deleted file mode 100644 index 50a0bdd..0000000 --- a/fw/fe310/eos/dev/cam.c +++ /dev/null @@ -1,140 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> - -#include "eos.h" - -#include "soc/spi.h" - -#include "cam.h" - -const int _eos_cam_resolution[][2] = { -    {0,    0   }, -    // C/SIF Resolutions -    {88,   72  },    /* QQCIF     */ -    {176,  144 },    /* QCIF      */ -    {352,  288 },    /* CIF       */ -    {88,   60  },    /* QQSIF     */ -    {176,  120 },    /* QSIF      */ -    {352,  240 },    /* SIF       */ -    // VGA Resolutions -    {40,   30  },    /* QQQQVGA   */ -    {80,   60  },    /* QQQVGA    */ -    {160,  120 },    /* QQVGA     */ -    {320,  240 },    /* QVGA      */ -    {640,  480 },    /* VGA       */ -    {60,   40  },    /* HQQQVGA   */ -    {120,  80  },    /* HQQVGA    */ -    {240,  160 },    /* HQVGA     */ -    // FFT Resolutions -    {64,   32  },    /* 64x32     */ -    {64,   64  },    /* 64x64     */ -    {128,  64  },    /* 128x64    */ -    {128,  128 },    /* 128x128   */ -    {320,  320 },    /* 128x128   */ -    // Other -    {128,  160 },    /* LCD       */ -    {128,  160 },    /* QQVGA2    */ -    {720,  480 },    /* WVGA      */ -    {752,  480 },    /* WVGA2     */ -    {800,  600 },    /* SVGA      */ -    {1024, 768 },    /* XGA       */ -    {1280, 1024},    /* SXGA      */ -    {1600, 1200},    /* UXGA      */ -    {1280, 720 },    /* HD        */ -    {1920, 1080},    /* FHD       */ -    {2560, 1440},    /* QHD       */ -    {2048, 1536},    /* QXGA      */ -    {2560, 1600},    /* WQXGA     */ -    {2592, 1944},    /* WQXGA2    */ -}; - -#define CAM_REG_CAPTURE_CTRL        0x01 -#define CAM_REG_FIFO_CTRL           0x04 - -#define CAM_REG_GPIO_DIR            0x05 -#define CAM_REG_GPIO_WR             0x06 -#define CAM_REG_GPIO_RD             0x45 - -#define CAM_REG_STATUS              0x41 - -#define CAM_REG_VER                 0x40 - -#define CAM_REG_READ_BURST          0x3c -#define CAM_REG_READ_BYTE           0x3d - -#define CAM_REG_FIFO_SIZE1          0x42 -#define CAM_REG_FIFO_SIZE2          0x43 -#define CAM_REG_FIFO_SIZE3          0x44 - -#define CAM_VAL_FIFO_CTRL_CLEAR     0x01 -#define CAM_VAL_FIFO_CTRL_START     0x02 -#define CAM_VAL_FIFO_CTRL_RSTWR     0x10 -#define CAM_VAL_FIFO_CTRL_RSTRD     0x20 - -#define CAM_VAL_STATUS_VSYNC        0x01 -#define CAM_VAL_STATUS_SHUTTER      0x02 -#define CAM_VAL_STATUS_CPTDONE      0x08 - -#define CAM_VAL_GPIO_RST            0x01 -#define CAM_VAL_GPIO_PWRDN          0x02 -#define CAM_VAL_GPIO_PWREN          0x04 - -static uint8_t reg_read(uint8_t addr) { -    uint8_t ret; - -    eos_spi_cs_set(); -    eos_spi_xchg8(addr, 0); -    ret = eos_spi_xchg8(0, 0); -    eos_spi_cs_clear(); - -    return ret; -} - -static void reg_write(uint8_t addr, uint8_t val) { -    eos_spi_cs_set(); -    eos_spi_xchg8(addr | 0x80, 0); -    eos_spi_xchg8(val, 0); -    eos_spi_cs_clear(); -} - -void eos_cam_capture(void) { -    reg_write(CAM_REG_FIFO_CTRL, CAM_VAL_FIFO_CTRL_START); -} - -int eos_cam_capture_done(void) { -    return !!(reg_read(CAM_REG_STATUS) & CAM_VAL_STATUS_CPTDONE); -} - -void eos_cam_capture_wait(void) { -    int done = 0; - -    while (!done) { -        done = eos_cam_capture_done(); -    } -} - -uint32_t eos_cam_fbuf_size(void) { -    uint32_t ret; - -	ret = reg_read(CAM_REG_FIFO_SIZE1); -    ret |= reg_read(CAM_REG_FIFO_SIZE2) << 8; -    ret |= (reg_read(CAM_REG_FIFO_SIZE3) & 0x7f) << 16; -    return ret; -} - -void eos_cam_fbuf_read(uint8_t *buffer, uint16_t sz, int first) { -    int i; - -    eos_spi_cs_set(); -    eos_spi_xchg8(CAM_REG_READ_BURST, 0); -    if (first) eos_spi_xchg8(0, 0); - -    for (i=0; i<sz; i++) { -        buffer[i] = eos_spi_xchg8(0, 0); -    } -    eos_spi_cs_clear(); -} - -void eos_cam_fbuf_done(void) { -    reg_write(CAM_REG_FIFO_CTRL, CAM_VAL_FIFO_CTRL_CLEAR); -} diff --git a/fw/fe310/eos/dev/cam.h b/fw/fe310/eos/dev/cam.h deleted file mode 100644 index f61757b..0000000 --- a/fw/fe310/eos/dev/cam.h +++ /dev/null @@ -1,88 +0,0 @@ -#include <stdint.h> - -typedef enum { -    PIXFORMAT_INVALID = 0, -    PIXFORMAT_BINARY,    // 1BPP/BINARY -    PIXFORMAT_GRAYSCALE, // 1BPP/GRAYSCALE -    PIXFORMAT_RGB565,    // 2BPP/RGB565 -    PIXFORMAT_YUV422,    // 2BPP/YUV422 -    PIXFORMAT_BAYER,     // 1BPP/RAW -    PIXFORMAT_JPEG,      // JPEG/COMPRESSED -} pixformat_t; - -typedef enum { -    FRAMESIZE_INVALID = 0, -    // C/SIF Resolutions -    FRAMESIZE_QQCIF,    // 88x72 -    FRAMESIZE_QCIF,     // 176x144 -    FRAMESIZE_CIF,      // 352x288 -    FRAMESIZE_QQSIF,    // 88x60 -    FRAMESIZE_QSIF,     // 176x120 -    FRAMESIZE_SIF,      // 352x240 -    // VGA Resolutions -    FRAMESIZE_QQQQVGA,  // 40x30 -    FRAMESIZE_QQQVGA,   // 80x60 -    FRAMESIZE_QQVGA,    // 160x120 -    FRAMESIZE_QVGA,     // 320x240 -    FRAMESIZE_VGA,      // 640x480 -    FRAMESIZE_HQQQVGA,  // 60x40 -    FRAMESIZE_HQQVGA,   // 120x80 -    FRAMESIZE_HQVGA,    // 240x160 -    // FFT Resolutions -    FRAMESIZE_64X32,    // 64x32 -    FRAMESIZE_64X64,    // 64x64 -    FRAMESIZE_128X64,   // 128x64 -    FRAMESIZE_128X128,  // 128x128 -    FRAMESIZE_320X320,  // 320x320 -    // Other -    FRAMESIZE_LCD,      // 128x160 -    FRAMESIZE_QQVGA2,   // 128x160 -    FRAMESIZE_WVGA,     // 720x480 -    FRAMESIZE_WVGA2,    // 752x480 -    FRAMESIZE_SVGA,     // 800x600 -    FRAMESIZE_XGA,      // 1024x768 -    FRAMESIZE_SXGA,     // 1280x1024 -    FRAMESIZE_UXGA,     // 1600x1200 -    FRAMESIZE_HD,       // 1280x720 -    FRAMESIZE_FHD,      // 1920x1080 -    FRAMESIZE_QHD,      // 2560x1440 -    FRAMESIZE_QXGA,     // 2048x1536 -    FRAMESIZE_WQXGA,    // 2560x1600 -    FRAMESIZE_WQXGA2,   // 2592x1944 -} framesize_t; - -typedef enum { -    GAINCEILING_2X, -    GAINCEILING_4X, -    GAINCEILING_8X, -    GAINCEILING_16X, -    GAINCEILING_32X, -    GAINCEILING_64X, -    GAINCEILING_128X, -} gainceiling_t; - -typedef enum { -    SDE_NORMAL, -    SDE_NEGATIVE, -} sde_t; - -extern const int _eos_cam_resolution[][2]; - -#define IM_LOG2_2(x)    (((x) &                0x2ULL) ? ( 2                        ) :             1) // NO ({ ... }) ! -#define IM_LOG2_4(x)    (((x) &                0xCULL) ? ( 2 +  IM_LOG2_2((x) >>  2)) :  IM_LOG2_2(x)) // NO ({ ... }) ! -#define IM_LOG2_8(x)    (((x) &               0xF0ULL) ? ( 4 +  IM_LOG2_4((x) >>  4)) :  IM_LOG2_4(x)) // NO ({ ... }) ! -#define IM_LOG2_16(x)   (((x) &             0xFF00ULL) ? ( 8 +  IM_LOG2_8((x) >>  8)) :  IM_LOG2_8(x)) // NO ({ ... }) ! -#define IM_LOG2_32(x)   (((x) &         0xFFFF0000ULL) ? (16 + IM_LOG2_16((x) >> 16)) : IM_LOG2_16(x)) // NO ({ ... }) ! -#define IM_LOG2(x)      (((x) & 0xFFFFFFFF00000000ULL) ? (32 + IM_LOG2_32((x) >> 32)) : IM_LOG2_32(x)) // NO ({ ... }) ! - -#define IM_MAX(a,b)     ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a : _b; }) -#define IM_MIN(a,b)     ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; }) -#define IM_DIV(a,b)     ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _b ? (_a / _b) : 0; }) -#define IM_MOD(a,b)     ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _b ? (_a % _b) : 0; }) - -void eos_cam_capture(void); -int eos_cam_capture_done(void); -void eos_cam_capture_wait(void); -uint32_t eos_cam_fbuf_size(void); -void eos_cam_fbuf_read(uint8_t *buffer, uint16_t sz, int first); -void eos_cam_fbuf_done(void); diff --git a/fw/fe310/eos/dev/drv/arducam.c b/fw/fe310/eos/dev/drv/arducam.c new file mode 100644 index 0000000..e41d541 --- /dev/null +++ b/fw/fe310/eos/dev/drv/arducam.c @@ -0,0 +1,99 @@ +#include <stdlib.h> +#include <stdint.h> + +#include "eos.h" + +#include "soc/spi.h" + +#include "arducam.h" + +#define ARDUCAM_REG_CAPTURE_CTRL        0x01 +#define ARDUCAM_REG_FIFO_CTRL           0x04 + +#define ARDUCAM_REG_GPIO_DIR            0x05 +#define ARDUCAM_REG_GPIO_WR             0x06 +#define ARDUCAM_REG_GPIO_RD             0x45 + +#define ARDUCAM_REG_STATUS              0x41 + +#define ARDUCAM_REG_VER                 0x40 + +#define ARDUCAM_REG_READ_BURST          0x3c +#define ARDUCAM_REG_READ_BYTE           0x3d + +#define ARDUCAM_REG_FIFO_SIZE1          0x42 +#define ARDUCAM_REG_FIFO_SIZE2          0x43 +#define ARDUCAM_REG_FIFO_SIZE3          0x44 + +#define ARDUCAM_VAL_FIFO_CTRL_CLEAR     0x01 +#define ARDUCAM_VAL_FIFO_CTRL_START     0x02 +#define ARDUCAM_VAL_FIFO_CTRL_RSTWR     0x10 +#define ARDUCAM_VAL_FIFO_CTRL_RSTRD     0x20 + +#define ARDUCAM_VAL_STATUS_VSYNC        0x01 +#define ARDUCAM_VAL_STATUS_SHUTTER      0x02 +#define ARDUCAM_VAL_STATUS_CPTDONE      0x08 + +#define ARDUCAM_VAL_GPIO_RST            0x01 +#define ARDUCAM_VAL_GPIO_PWRDN          0x02 +#define ARDUCAM_VAL_GPIO_PWREN          0x04 + +static uint8_t reg_read(uint8_t addr) { +    uint8_t ret; + +    eos_spi_cs_set(); +    eos_spi_xchg8(addr, 0); +    ret = eos_spi_xchg8(0, 0); +    eos_spi_cs_clear(); + +    return ret; +} + +static void reg_write(uint8_t addr, uint8_t val) { +    eos_spi_cs_set(); +    eos_spi_xchg8(addr | 0x80, 0); +    eos_spi_xchg8(val, 0); +    eos_spi_cs_clear(); +} + +void arducam_capture(void) { +    reg_write(ARDUCAM_REG_FIFO_CTRL, ARDUCAM_VAL_FIFO_CTRL_START); +} + +int arducam_capture_done(void) { +    return !!(reg_read(ARDUCAM_REG_STATUS) & ARDUCAM_VAL_STATUS_CPTDONE); +} + +void arducam_capture_wait(void) { +    int done = 0; + +    while (!done) { +        done = arducam_capture_done(); +    } +} + +uint32_t arducam_fbuf_size(void) { +    uint32_t ret; + +	ret = reg_read(ARDUCAM_REG_FIFO_SIZE1); +    ret |= reg_read(ARDUCAM_REG_FIFO_SIZE2) << 8; +    ret |= (reg_read(ARDUCAM_REG_FIFO_SIZE3) & 0x7f) << 16; +    return ret; +} + +void arducam_fbuf_read(uint8_t *buffer, uint16_t sz, int first) { +    int i; + +    eos_spi_cs_set(); +    eos_spi_xchg8(ARDUCAM_REG_READ_BURST, 0); +    if (first) eos_spi_xchg8(0, 0); + +    for (i=0; i<sz; i++) { +        buffer[i] = eos_spi_xchg8(0, 0); +    } +    eos_spi_cs_clear(); +} + +void arducam_fbuf_done(void) { +    reg_write(ARDUCAM_REG_FIFO_CTRL, ARDUCAM_VAL_FIFO_CTRL_CLEAR); +} diff --git a/fw/fe310/eos/dev/drv/arducam.h b/fw/fe310/eos/dev/drv/arducam.h new file mode 100644 index 0000000..1db9f17 --- /dev/null +++ b/fw/fe310/eos/dev/drv/arducam.h @@ -0,0 +1,8 @@ +#include <stdint.h> + +void arducam_capture(void); +int arducam_capture_done(void); +void arducam_capture_wait(void); +uint32_t arducam_fbuf_size(void); +void arducam_fbuf_read(uint8_t *buffer, uint16_t sz, int first); +void arducam_fbuf_done(void); | 
