Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/media/platform/qcom/camss/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 4 kB image not shown  

Quelle  camss-vfe-780.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Qualcomm MSM Camera Subsystem - VFE (Video Front End) Module v780 (SM8550)
 *
 * Copyright (c) 2024 Qualcomm Technologies, Inc.
 */


#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/iopoll.h>

#include "camss.h"
#include "camss-vfe.h"

#define BUS_REG_BASE   (vfe_is_lite(vfe) ? 0x200 : 0xC00)

#define VFE_BUS_WM_CGC_OVERRIDE  (BUS_REG_BASE + 0x08)
#define  WM_CGC_OVERRIDE_ALL  (0x7FFFFFF)

#define VFE_BUS_WM_TEST_BUS_CTRL (BUS_REG_BASE + 0xDC)

#define VFE_BUS_WM_CFG(n)  (BUS_REG_BASE + 0x200 + (n) * 0x100)
#define  WM_CFG_EN   BIT(0)
#define  WM_VIR_FRM_EN   BIT(1)
#define  WM_CFG_MODE   BIT(16)
#define VFE_BUS_WM_IMAGE_ADDR(n) (BUS_REG_BASE + 0x204 + (n) * 0x100)
#define VFE_BUS_WM_FRAME_INCR(n) (BUS_REG_BASE + 0x208 + (n) * 0x100)
#define VFE_BUS_WM_IMAGE_CFG_0(n) (BUS_REG_BASE + 0x20c + (n) * 0x100)
#define  WM_IMAGE_CFG_0_DEFAULT_WIDTH (0xFFFF)
#define VFE_BUS_WM_IMAGE_CFG_2(n) (BUS_REG_BASE + 0x214 + (n) * 0x100)
#define  WM_IMAGE_CFG_2_DEFAULT_STRIDE (0xFFFF)
#define VFE_BUS_WM_PACKER_CFG(n) (BUS_REG_BASE + 0x218 + (n) * 0x100)

#define VFE_BUS_WM_IRQ_SUBSAMPLE_PERIOD(n) (BUS_REG_BASE + 0x230 + (n) * 0x100)
#define VFE_BUS_WM_IRQ_SUBSAMPLE_PATTERN(n) (BUS_REG_BASE + 0x234 + (n) * 0x100)
#define VFE_BUS_WM_FRAMEDROP_PERIOD(n)  (BUS_REG_BASE + 0x238 + (n) * 0x100)
#define VFE_BUS_WM_FRAMEDROP_PATTERN(n)  (BUS_REG_BASE + 0x23c + (n) * 0x100)

#define VFE_BUS_WM_MMU_PREFETCH_CFG(n)  (BUS_REG_BASE + 0x260 + (n) * 0x100)
#define VFE_BUS_WM_MMU_PREFETCH_MAX_OFFSET(n) (BUS_REG_BASE + 0x264 + (n) * 0x100)

/*
 * Bus client mapping:
 *
 * Full VFE:
 * 23 = RDI0, 24 = RDI1, 25 = RDI2
 *
 * VFE LITE:
 * 0 = RDI0, 1 = RDI1, 2 = RDI3, 4 = RDI4
 */

#define RDI_WM(n)   ((vfe_is_lite(vfe) ? 0x0 : 0x17) + (n))

static void vfe_wm_start(struct vfe_device *vfe, u8 wm, struct vfe_line *line)
{
 struct v4l2_pix_format_mplane *pix =
  &line->video_out.active_fmt.fmt.pix_mp;

 wm = RDI_WM(wm);

 /* no clock gating at bus input */
 writel(WM_CGC_OVERRIDE_ALL, vfe->base + VFE_BUS_WM_CGC_OVERRIDE);

 writel(0x0, vfe->base + VFE_BUS_WM_TEST_BUS_CTRL);

 writel(ALIGN(pix->plane_fmt[0].bytesperline, 16) * pix->height >> 8,
        vfe->base + VFE_BUS_WM_FRAME_INCR(wm));
 writel((WM_IMAGE_CFG_0_DEFAULT_WIDTH & 0xFFFF),
        vfe->base + VFE_BUS_WM_IMAGE_CFG_0(wm));
 writel(WM_IMAGE_CFG_2_DEFAULT_STRIDE,
        vfe->base + VFE_BUS_WM_IMAGE_CFG_2(wm));
 writel(0, vfe->base + VFE_BUS_WM_PACKER_CFG(wm));

 /* no dropped frames, one irq per frame */
 writel(0, vfe->base + VFE_BUS_WM_FRAMEDROP_PERIOD(wm));
 writel(1, vfe->base + VFE_BUS_WM_FRAMEDROP_PATTERN(wm));
 writel(0, vfe->base + VFE_BUS_WM_IRQ_SUBSAMPLE_PERIOD(wm));
 writel(1, vfe->base + VFE_BUS_WM_IRQ_SUBSAMPLE_PATTERN(wm));

 writel(1, vfe->base + VFE_BUS_WM_MMU_PREFETCH_CFG(wm));
 writel(0xFFFFFFFF, vfe->base + VFE_BUS_WM_MMU_PREFETCH_MAX_OFFSET(wm));

 writel(WM_CFG_EN | WM_CFG_MODE, vfe->base + VFE_BUS_WM_CFG(wm));
}

static void vfe_wm_stop(struct vfe_device *vfe, u8 wm)
{
 wm = RDI_WM(wm);
 writel(0, vfe->base + VFE_BUS_WM_CFG(wm));
}

static void vfe_wm_update(struct vfe_device *vfe, u8 wm, u32 addr,
     struct vfe_line *line)
{
 wm = RDI_WM(wm);
 writel((addr >> 8) & 0xFFFFFFFF, vfe->base + VFE_BUS_WM_IMAGE_ADDR(wm));

 dev_dbg(vfe->camss->dev, "wm:%d, image buf addr:0x%x\n",
  wm, addr);
}

static void vfe_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id)
{
 int port_id = line_id;

 camss_reg_update(vfe->camss, vfe->id, port_id, false);
}

static inline void vfe_reg_update_clear(struct vfe_device *vfe,
     enum vfe_line_id line_id)
{
 int port_id = line_id;

 camss_reg_update(vfe->camss, vfe->id, port_id, true);
}

static const struct camss_video_ops vfe_video_ops_780 = {
 .queue_buffer = vfe_queue_buffer_v2,
 .flush_buffers = vfe_flush_buffers,
};

static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe)
{
 vfe->video_ops = vfe_video_ops_780;
}

static void vfe_global_reset(struct vfe_device *vfe)
{
 vfe_isr_reset_ack(vfe);
}

static irqreturn_t vfe_isr(int irq, void *dev)
{
 /* nop */
 return IRQ_HANDLED;
}

static int vfe_halt(struct vfe_device *vfe)
{
 /* rely on vfe_disable_output() to stop the VFE */
 return 0;
}

const struct vfe_hw_ops vfe_ops_780 = {
 .global_reset = vfe_global_reset,
 .hw_version = vfe_hw_version,
 .isr = vfe_isr,
 .pm_domain_off = vfe_pm_domain_off,
 .pm_domain_on = vfe_pm_domain_on,
 .reg_update = vfe_reg_update,
 .reg_update_clear = vfe_reg_update_clear,
 .subdev_init = vfe_subdev_init,
 .vfe_disable = vfe_disable,
 .vfe_enable = vfe_enable_v2,
 .vfe_halt = vfe_halt,
 .vfe_wm_start = vfe_wm_start,
 .vfe_wm_stop = vfe_wm_stop,
 .vfe_buf_done = vfe_buf_done,
 .vfe_wm_update = vfe_wm_update,
};

Messung V0.5
C=94 H=95 G=94

¤ Dauer der Verarbeitung: 0.1 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.