cartesio_nand.c

编程器烧写nandflash(西尔特SuperPro_5000E) .烧写工具: 三星K9F1G08U0B Nandflash,西尔特SUPERPRO-5000E烧写器   二.烧写步骤:   1.       读取能正常启动的nandflash中数据。读取数据时,器件配置字如下: 说明: 这里Ecc Bias Addr(hex)和OEMReserved BB Mark(hex)据烧写器厂家讲可以不管,他说普通的烧写,并不要求这两个数据。 阅读详情

这是sta2065 平台的 nandflash 驱动实现代码,位于drivers/mtd/nand/cartesio_nand.c

1. init/exit:

static int __init cartesio_nand_init(void)
{
        return platform_driver_register(&cartesio_nand_driver);
}

static void __exit cartesio_nand_exit(void)
{
        platform_driver_unregister(&cartesio_nand_driver);
}

module_init(cartesio_nand_init);
module_exit(cartesio_nand_exit);
static struct platform_driver cartesio_nand_driver = {
        .probe          = cartesio_nand_probe,
        .remove         = __devexit_p(cartesio_nand_remove),
        .driver = {
                .name   = "CARTESIO-NAND",
                .owner  = THIS_MODULE,
        },
};
2. static int __devinit cartesio_nand_probe(struct platform_device *pdev)

在cartesio_nand_probe 函数中会赋值一堆函数指针,这些函数都会在这个代码中实现。

/*
 * Probe for the NAND device
 */
static int __devinit cartesio_nand_probe(struct platform_device *pdev)
{
        struct platform_nand_data *pdata = pdev->dev.platform_data;
        struct cartesio_nand_data *data;
        struct resource *res;
#if defined(CONFIG_MACH_CARTESIO_CHAPLIN) || defined (CONFIG_MACH_CARTESIO_TIGER4)
        char buf[4];
        int status;
#endif
#if defined(CONFIG_MACH_CARTESIO_CHAPLIN) || defined (CONFIG_MACH_CARTESIO_TIGER4) || defined(CONFIG_CARTESIO_NAND_DMA)
        struct nand_chip        *chip;
        struct mtd_info         *mtd;
#endif
        int ret = 0;
#ifdef CONFIG_CARTESIO_NAND_DMA
        struct pl080_dma_slave *client;
        dma_cap_mask_t mask;
#endif
        /* must have platform data */
        if (!pdata) {
                dev_err(&pdev->dev, "missing platform data\n");
                return -ENODEV;
        }

        if (pdata->chip.chip_offset >= FSMC_DEVICE_NUM || pdata->chip.nr_chips != 1)
                return -EINVAL;

        /* must have reference to parent FSMC device */
        if (!pdev->dev.parent) {
                dev_err(&pdev->dev, "missing reference to parent FSMC device\n");
                return -ENODEV;
        }

        /* allocate memory for the device structure (and zero it) */
        data = kzalloc(sizeof(struct cartesio_nand_data), GFP_KERNEL);
        if (!data) {
                dev_err(&pdev->dev, "failed to allocate device structure\n");
                return -ENOMEM;
        }

        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(&pdev->dev, "missing I/O memory resource\n");
                kfree(data);
                return -ENXIO;
        }

        data->io_base = ioremap(res->start, resource_size(res));
        if (data->io_base == NULL) {
                dev_err(&pdev->dev, "failed to remap memory space\n");
                kfree(data);
                return -EIO;
        }

        data->chip.priv = data;
        data->mtd.priv = &data->chip;
        data->mtd.owner = THIS_MODULE;
        data->mtd.name = dev_name(&pdev->dev);

        data->chip.IO_ADDR_R = data->io_base + FSMC_NAND_DIO;
        data->chip.IO_ADDR_W = data->io_base + FSMC_NAND_DIO;
        data->chip.cmd_ctrl = cartesio_nand_hwcontrol;             //赋值一堆函数指针,这些都是nand_chip设备的操作函数。
        data->chip.dev_ready = pdata->ctrl.dev_ready;
        data->chip.select_chip = pdata->ctrl.select_chip;
        data->chip.write_buf = pdata->ctrl.write_buf;
        data->chip.read_buf = pdata->ctrl.read_buf;
        data->chip.chip_delay = pdata->chip.chip_delay;
        data->chip.options |= pdata->chip.options;

        data->chip.ecc.mode = NAND_ECC_HW;
#ifdef CONFIG_BCH_8
        data->chip.ecc.bytes = 13;
        data->chip.ecc.read_page = cartesio_nand_read_page_hwecc;
#ifdef CONFIG_CARTESIO_NAND_DMA
        data->chip.ecc.write_page = cartesio_nand_write_page_hwecc;
#endif
        data->chip.ecc.correct = cartesio_nand_correctdata;
        data->chip.read_buf = cartesio_nand_read_buf;
#else
        data->chip.ecc.bytes = 3;
        data->chip.ecc.correct = nand_correct_data;
#endif
        data->chip.ecclayout = pdata->chip.ecclayout;
        data->chip.ecc.layout = pdata->chip.ecclayout;
        data->chip.ecc.hwctl = cartesio_nand_hwctl;
        data->chip.ecc.calculate = cartesio_nand_calculate;

        data->chip.bbt_td = &cartesio_nand_bbt_descr;
        data->chip.bbt_md = &cartesio_nand_bbt_descr;

        data->fsmc_device = pdev->dev.parent;
        data->fsmc_slot = pdata->chip.chip_offset;

        platform_set_drvdata(pdev, data);

        /* handle any platform specific setup */
        if (pdata->ctrl.probe) {
                ret = pdata->ctrl.probe(pdev);
                if (ret)
                        goto out;
        }

        /* first scan to find the device and get the page size */
        if (nand_scan_ident(&data->mtd, pdata->chip.nr_chips)) {
                ret = -ENXIO;
                goto out;
        }

        /* set ECC page size and oob layout */
        switch (data->mtd.writesize) {
        case 256:
                data->chip.ecc.steps = 1;
                data->chip.ecc.size = 256;
                fsmc_set_ecc(data->fsmc_device, data->fsmc_slot, ECC_PAGE_256);
                break;
        case 512:
                data->chip.ecc.steps = 1;
                data->chip.ecc.size = 512;
                fsmc_set_ecc(data->fsmc_device, data->fsmc_slot, ECC_PAGE_512);
                break;
        case 2048:
                data->chip.ecc.steps = 4;
                data->chip.ecc.size = 512;
                fsmc_set_ecc(data->fsmc_device, data->fsmc_slot, ECC_PAGE_512);
                break;
        case 4096:
                data->chip.ecc.steps =8;
                data->chip.ecc.size = 512;
                fsmc_set_ecc(data->fsmc_device, data->fsmc_slot, ECC_PAGE_512);
                break;
        default:
                /* page size not handled by HW ECC */
                data->chip.ecc.mode = NAND_ECC_NONE;
                break;
        }

        /* second phase of the device scan */
        if (nand_scan_tail(&data->mtd)) {
                ret = -ENXIO;
                goto out;
        }

#ifdef CONFIG_MTD_PARTITIONS
        if (pdata->chip.part_probe_types) {
                ret = parse_mtd_partitions(&data->mtd,
                                        pdata->chip.part_probe_types,
                                        &data->parts, 0);
               if (ret > 0) {
                        add_mtd_partitions(&data->mtd, data->parts, ret);
                        return 0;
                }
        }
        if (pdata->chip.set_parts)
                pdata->chip.set_parts(data->mtd.size, &pdata->chip);
        if (pdata->chip.partitions) {
                data->parts = pdata->chip.partitions;
                ret = add_mtd_partitions(&data->mtd, data->parts,
                        pdata->chip.nr_partitions);
        } else
#endif
        ret = add_mtd_device(&data->mtd);

#if defined(CONFIG_MACH_CARTESIO_CHAPLIN) || defined (CONFIG_MACH_CARTESIO_TIGER4) || defined(CONFIG_CARTESIO_NAND_DMA)
        mtd = &data->mtd;
        chip = &data->chip;
#endif
#if defined(CONFIG_MACH_CARTESIO_CHAPLIN) || defined (CONFIG_MACH_CARTESIO_TIGER4)

        /* command to enable and disable Inetrnal ECC*/
        //Set features 0xEF command
        chip->cmd_ctrl(mtd, 0xEF,NAND_CLE);
        //Address command
        chip->cmd_ctrl(mtd, 0x90,NAND_ALE);
        //Data Command
        udelay(chip->chip_delay);
        buf[0] = 0;
        buf[1] = 0;
        buf[2] = 0;
        buf[3] = 0;

        chip->write_buf(mtd, buf, 4);

        status = chip->waitfunc(mtd, chip);

        if(status & NAND_STATUS_FAIL)
                printk("Error in setting features\n");
#endif
#ifdef CONFIG_CARTESIO_NAND_DMA
        init_completion(&data->dma_read_complete);
        init_completion(&data->dma_write_complete);

        client = (struct pl080_dma_slave*)pdata->ctrl.priv;
        data->transfer_addr = res->start + FSMC_NAND_DIO;
        dma_cap_zero(mask);
        dma_cap_set(DMA_SLAVE, mask);

        /* Only one channel is allocated as read and write commands
         * comes mutually exclusive. Lock is taken by nand_read and
         * nand_write command.
         */
        data->chan = dma_request_channel(mask, pl080_dma_filter, client);
        if (!data->chan) {
                printk("unable to get a DMA channel\n");
                ret = -EINVAL;
                goto out;
        }

#endif
        if (!ret)
                return ret;

        nand_release(&data->mtd);
out:
        if (pdata->ctrl.remove)
                pdata->ctrl.remove(pdev);
        platform_set_drvdata(pdev, NULL);
        iounmap(data->io_base);
        kfree(data);
        return ret;
}
3. static int __devexit cartesio_nand_remove(struct platform_device *pdev)
/*
 * Remove a NAND device
 */
static int __devexit cartesio_nand_remove(struct platform_device *pdev)
{
        struct cartesio_nand_data *data = platform_get_drvdata(pdev);
        struct platform_nand_data *pdata = pdev->dev.platform_data;

        nand_release(&data->mtd);
#ifdef CONFIG_MTD_PARTITIONS
        if (data->parts && data->parts != pdata->chip.partitions)
                kfree(data->parts);
#endif

#ifdef CONFIG_CARTESIO_NAND_DMA
        dma_release_channel(data->chan);
#endif
        if (pdata->ctrl.remove)
                pdata->ctrl.remove(pdev);
        iounmap(data->io_base);
        kfree(data);

        return 0;
}
4. 一些数据结构:

struct cartesio_nand_data:

struct cartesio_nand_data {
        struct nand_chip        chip;
        struct mtd_info         mtd;
        void __iomem            *io_base;
        struct device           *fsmc_device;
        int                                     fsmc_slot;
#ifdef CONFIG_MTD_PARTITIONS
        int                     nr_parts;
        struct mtd_partition    *parts;
#endif
#ifdef CONFIG_CARTESIO_NAND_DMA
        struct dma_chan *chan;
        struct dma_async_tx_descriptor *desc;
        dma_addr_t transfer_addr;
        struct completion dma_read_complete;
        struct completion dma_write_complete;
#endif
};
5. nand_chip的操作函数:

static void cartesio_nand_hwcontrol(struct mtd_info *mtd, int cmd,
                                unsigned int ctrl)

/*
 * Control ALE/CLE/nCE and write command and address
 */
static void cartesio_nand_hwcontrol(struct mtd_info *mtd, int cmd,
                                unsigned int ctrl)
{
        struct nand_chip *chip = mtd->priv;
        struct cartesio_nand_data *data = chip->priv;

        if (cmd == NAND_CMD_NONE)
                return;

        if (ctrl & NAND_CLE)
                writeb(cmd, data->io_base + FSMC_NAND_CLE);

        if (ctrl & NAND_ALE) {
                writeb(cmd, data->io_base + FSMC_NAND_ALE);
        }
}
static int cartesio_nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
                                uint8_t *buf, int page)

/**
 * cartesio_nand_read_page_hwecc - [REPLACABLE] hardware ecc based page read function
 * @mtd:        mtd info structure
 * @chip:       nand chip info structure
 * @buf:        buffer to store read data
 * @page:       page number to read
 *
 * Not for syndrome calculating ecc controllers which need a special oob layout
 */
static int cartesio_nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
                                uint8_t *buf, int page)
{
        int i, eccsize = chip->ecc.size;
        u32 eccbytes = chip->ecc.bytes;
        uint32_t *eccpos = chip->ecc.layout->eccpos;
        uint8_t *ecc_calc = chip->buffers->ecccalc;
        u32 eccsteps = 0;
        uint8_t *p = buf;
        u32 position1;
        u8 error_count;
        char temp_buf[eccbytes];
#ifdef CONFIG_CARTESIO_NAND_DMA
        int dma_flag = 1;
        struct cartesio_nand_data *data = chip->priv;
        dma_addr_t dest = 0;
        dma_addr_t src = 0;

        if(!virt_addr_valid(buf))
                dma_flag = 0;
        if(dma_flag)
        {
                dest = dma_map_single(NULL, buf, chip->ecc.steps*eccsize, DMA_FROM_DEVICE);
                src = data->transfer_addr;
        }
#endif

#ifdef CONFIG_CARTESIO_NAND_DMA
        for (i = 0; eccsteps < chip->ecc.steps; i += eccbytes, p += eccsize, dest += eccsize) {
#else
        for (i = 0; eccsteps < chip->ecc.steps; i += eccbytes, p += eccsize) {
#endif
                chip->ecc.hwctl(mtd, NAND_ECC_READ);
#ifdef CONFIG_CARTESIO_NAND_DMA
                if(dma_flag)
                {
                        nand_rx_dma_transfer(mtd, p, eccsize, src, dest);
                        wait_for_completion_timeout(&data->dma_read_complete,40);
                }
                else
#endif
                chip->read_buf(mtd, p, eccsize);

                position1 = mtd->writesize + eccpos[eccbytes*eccsteps];
                chip->cmdfunc(mtd, NAND_CMD_RNDOUT, position1, -1);
                chip->read_buf(mtd, temp_buf, 16);
                eccsteps++;
                position1 = eccsteps*eccsize;
                chip->cmdfunc(mtd, NAND_CMD_RNDOUT, position1, -1);
                chip->ecc.calculate(mtd, p, &ecc_calc[0]);
                {
                        int stat = 0;
                        error_count = (ecc_calc[12] & ERROR_COUNT_MASK) >> ERROR_COUNT_POS;
                        if(error_count > 0 && error_count <= ERROR_COUNT_MAX)
                                stat = nand_correctdata(mtd, p, &ecc_calc[0]);
                        if (stat)
                                mtd->ecc_stats.failed++;
                        else
                                mtd->ecc_stats.corrected += stat;
                }
        }
        return 0;
}
#endif
static void cartesio_nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
                                  const uint8_t *buf)

/**
 * nand_write_page_hwecc - [REPLACABLE] hardware ecc based page write function
 * @mtd:        mtd info structure
 * @chip:       nand chip info structure
 * @buf:        data buffer
 */
static void cartesio_nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
                                  const uint8_t *buf)
{
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
        int eccsteps = chip->ecc.steps;
        uint8_t *ecc_calc = chip->buffers->ecccalc;
        uint8_t *p =  (uint8_t *)buf;
        uint32_t *eccpos = chip->ecc.layout->eccpos;
        struct cartesio_nand_data *data = chip->priv;
        int dma_flag = 1;
        dma_addr_t src = 0;
        dma_addr_t dest = 0;

        if(!virt_addr_valid(buf))
                dma_flag = 0;
        if(dma_flag)
        {
                src = dma_map_single(NULL, (void *)p, eccsteps*eccsize, DMA_TO_DEVICE);
                dest = data->transfer_addr;
        }

        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize, src += eccsize) {
                chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
                if(dma_flag)
                {
                        nand_tx_dma_transfer(mtd, p, eccsize, src, dest);
                        wait_for_completion_timeout(&data->dma_write_complete,40);
                }
                else
                chip->write_buf(mtd, p, eccsize);
                chip->ecc.calculate(mtd, p, &ecc_calc[i]);
        }

        for (i = 0; i < chip->ecc.total; i++)
                chip->oob_poi[eccpos[i]] = ecc_calc[i];

        chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
}
static void cartesio_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
/**
 * cartesio_nand_read_buf - [DEFAULT] read chip data into buffer
 * @mtd:        MTD device structure
 * @buf:        buffer to store date
 * @len:        number of bytes to read
 *
 * Default read function for 8bit buswith
 */
static void cartesio_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
{
        int i;
        struct nand_chip *chip = mtd->priv;
        u32 *p = (u32 *)buf;
        len >>= 2;
        for (i = 0; i < len; i++)
                p[i] = readl(chip->IO_ADDR_R);
}
static void cartesio_nand_hwctl(struct mtd_info *mtd, int mode)
/*
 * Control hardware ECC
 */
static void cartesio_nand_hwctl(struct mtd_info *mtd, int mode)
{
        struct nand_chip *chip = mtd->priv;
        struct cartesio_nand_data *data = chip->priv;
        /*
         * Hardware ECC needs to be reset before reading or     writing a
         * page, otherwise bytes previously read or written in OOB area
         * will be erroneously taken into account
         */
        fsmc_set_ecc(data->fsmc_device, data->fsmc_slot, ECC_RESET);
}

static int cartesio_nand_calculate(struct mtd_info *mtd, const uint8_t *dat,
                                uint8_t *ecc_code)

/*
 * Get ECC from hardware
 */
static int cartesio_nand_calculate(struct mtd_info *mtd, const uint8_t *dat,
                                uint8_t *ecc_code)
{
        struct nand_chip *chip = mtd->priv;
        struct cartesio_nand_data *data = chip->priv;

        return fsmc_get_parity(data->fsmc_device, data->fsmc_slot, ecc_code);
}
static struct nand_bbt_descr cartesio_nand_bbt_descr
/*
 * Custom bad block table descriptor coming from Cartesio Bootloader legacy
 */
static uint8_t bbt_pattern[] = { 0xFF };

static struct nand_bbt_descr cartesio_nand_bbt_descr = {
        .options = NAND_BBT_SCANEMPTY | NAND_BBT_SCANALLPAGES | NAND_BBT_SCAN2NDPAGE,
        .offs = 0,
        .len = 1,
        .pattern = bbt_pattern,
};

spi-norflash s25fl128s driver s25fl128s 是一个spi接口的norflash芯片,spansion公司出品。 这里使用drivers/mtd/devices/mxc_m25p80.c这个驱动。 这个驱动兼容了好多公司个spi-flash芯片,如ST 的m25p80系列,Atmel at25系列,Macronix的mx25系列,SST的sst25系列,Spansion的s25系列等等。 这个驱动能给这么多spi设备 阅读详情

相关推荐

nandflash的datasheet中的一些参数

这里使用的是 美光的 MT29F2G16 芯片么, 1. 阵列的参数如下: • Organization – Page size x8: 2112 bytes (2048 + 64 bytes)         //这是8bit bus width – Page size x16: 1056 words (1024 + 32 words)   //这是16bit bus width,最后的

1394

添加 一个nandflash 需要修改的地方

已经有nandflash controller的驱动了,但是要添加一个新的nandflash,尤其是本来是8bit, 新加的是16bit时,需要注意如下: 1. board.c 中: static struct platform_nand_data cartesio_nand_mlc_data = { .chip = { .nr_chips

1133

驱动中访问mtd设备

今天解决了一个小问题,如何在linux驱动中访问mtd设备。 正常的访问,都是用户空间通过,open( /dev/mtd*, )  read(), write(), close() 来访问的。 这次由于在驱动中需要读取/dev/mtd4的一个sector, 这个sector是之前用来备份SD 卡的mbr的。 1. 访问的第一步是获得mtd设备,这有两种方法: 方法1:根据mtd nu

897

nand 中 sector page block 的关系

下面是一段loader的 代码 #define DEVICE_ID 0xCA #define MAKER_ID 0x2C #define NAND_TIMING_1 0x0D #define

2977

mtdoops 和 kdump 原理

kdump 可以记录 kernel panic 等log信息,他的原理就是建立一个工作队列,把kmsg log 备份到一个mtd分区上。 是在drivers/mtd/mtdoops.c 中实现的。 1. module_init/ module_exit module_init(mtdoops_init); module_exit(mtdoops_exit); MODULE_LICENS

2214

dd 之前必须 flash_eraseall 一下

用dd或nandwrite写mtd 设备 /dev/mtd* 之前,必须flash_erase 或flash_eraseall 一次,要不然会写不正确。

914

nandwrite 参数

$ nandwrite -h nandwrite: invalid option -- 'h' Usage: nandwrite [OPTION] MTD_DEVICE [INPUTFILE|-] Writes to the specified MTD device.   -a, --autoplace         Use auto oob layout   -j, --jffs

770

Flash设备驱动

今天又看了一遍Flash驱动,以下是一些总结。 Flash 设备驱动   一.MTD Linux系统中,用了MTD系统来建立flash对linux的接口。 MTD---memory technology device,内存技术设备。   MTD可以分为四个层: 1,  硬件驱动层:最底层,负责flash硬件设备的读、写、擦除。 Nor flash 芯片驱动位于/driver/

634

FSMC 驱动解析

FSMC是STA2x65的一个控制模块,全名Flexible Static Memory Controller (FSMC) The Flexible Static Controller (FSMC) supports, with two chip selects ● ROM ● Static RAM ● NOR type flash memories, not multiplexed

587

nandflash相关的一些结构题和操作函数

1. Nand_Init() int NandInit(void) { // ------------------------------- // Configure GPIO9 in Alt Funct. A // ------------------------------- *((uint32_t *) (GPIO0_REG_START_ADDR + 0x20

498

YOLO26算法保龄球馆保龄球目标检测+训练好的模型+743张数据集+pyqt可视化界面.zip

数据集可视化效果可参见下方展示。 【数据集概况】 · 检测类别(中文):[保龄球(bowling)] · 训练集:594 张 · 验证集:75 张 · 测试集:74 张 · 总计:743 张 该数据集聚焦于室内保龄球馆场景,系统性采集了多角度、多姿态下保龄球在不同运动阶段的视觉特征,为保龄球运动过程中的球体识别与轨迹分析提供了高质量标注样本,具有明确的体育训练与智能辅助系统开发价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9938** mAP50-95 | 0.6966 Precision | 0.9740 Recall | 0.9974 train/box_loss | 0.9113 train/cls_loss | 0.2862 val/box_loss | 1.1516 val/cls_loss | 0.3116 【训练过程分析】 100 轮训练后 mAP50 达到 0.9938,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6966,和 mAP50 差距 0.30,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9740、Recall 0.9974,精召双高,模型对保龄球的检测能力强。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖保龄球,置信度整体偏高。 【改进建议】 1. 丰富场景多样性:补充不同光照、背景和遮挡条件下的样本。 2. 提升输入分辨率:640 ...

PaddleOCRApi面向 Windows 与 Linux 的轻量级 OCR 与YOLO目标检测 HTTP 服务

PaddleOCR 与YOLO目标检测 HTTP 服务。 项目通过 PaddleOCROnnx 原生库集成 OnnxRuntime加速能力,围绕 ONNX 模型部署, 以统一接口提供图像文字识别、YOLO 目标检测和 Tensor 数据输出。 功能概览 文字识别:支持图片 Base64、multipart/form-data 上传,以及文本和 JSON 结果。 目标检测:支持 YOLO 图片检测,返回检测框 JSON 或原始 Tensor。 浏览器演示:访问服务根地址,上传图片并切换 OCR、YOLO 模式。 健康检查:通过 /health 查看服务及 OCR、YOLO 引擎初始化状态。 并发处理:通过 OCR 引擎实例池处理并发请求,可调整实例数量。 体验与调用 启动后访问: 入口 地址 浏览器演示 http://localhost:5000/ 健康检查 http://localhost:5000/health 原生依赖 Windows:优先从 runtimes/win-x64/native/ 加载原生 DLL;该目录没有 PaddleOCROnnx.dll 时,尝试从可执行文件所在目录加载。主 DLL 与对应后端依赖应放在同一原生目录中,不要将同一组依赖分散到多个目录。 Linux:原生运行时位于 runtimes/linux-x64/native/,程序使用相对于可执行文件的运行时搜索路径查找随包部署的依赖。 后端选择:CoreOCROnnx 支持 ONNX Runtime、OpenVINO、TensorRT 后端。请使用与平台、进程架构、硬件和后端匹配的一整套运行时,不要混用不同后端或版本的依赖。

goose 是一款在您的设备上运行的通用型 AI 代理

一款开源、可扩展的AI代理,功能远超代码建议——支持安装、执行、编辑以及与任何大型语言模型(LLM)进行测试。

丧尸枪战_1.0

丧尸枪战1.0这是一款我自己做的游戏2d版本的这个游戏我以后会更新

MATLAB中天线阵列的自适应波束形成仿真,包括干扰抑制和时变信号跟踪.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

【风场景生成与削减】【m-ISODATA、kmean、HAC】无监督聚类算法,用于捕获电力系统中风场景生成与削减研究(Matlab代码实现)

内容概要:本文聚焦于电力系统中风场景的生成与削减问题,系统性地应用m-ISODATA、k-means和HAC三种无监督聚类算法对大规模风力发电数据进行处理,旨在降低风电不确定性带来的计算负担并保留关键时序特征。研究基于Matlab平台实现了完整的数据预处理、聚类建模与结果可视化流程,深入探讨了各算法在确定聚类簇数、划分数据结构及构建层次关系方面的机理差异,并通过实验对比验证了其在场景削减效果、计算效率与鲁棒性方面的性能表现。该方法为含高比例风电的电力系统提供了高效、可靠的典型场景集构建手段,支撑后续的随机优化、风险评估与调度决策。; 适合人群:具备电力系统分析基础、熟悉Matlab编程的研究生、科研人员以及从事新能源并网、电力系统规划与运行优化的工程技术人员。; 使用场景及目标:①应对风电出力强随机性与波动性,为随机规划、鲁棒优化等高级应用提供精简且具代表性的输入场景;②深入比较m-ISODATA(自适应确定簇数)、k-means(高效快速划分)与HAC(构建层次化场景结构)三类算法的技术特点与适用边界,指导实际项目中算法选型;③通过代码实践掌握从原始风速/功率数据清洗、特征提取、距离度量选择、聚类有效性评估到最终场景概率赋值的全流程技术栈。; 阅读建议:学习者应结合提供的Matlab代码进行动手实践,重点理解数据标准化、欧式距离与动态时间规整(DTW)等相似性度量的选择依据、聚类数目评估指标(如肘部法则、轮廓系数)的应用,以及如何通过削减前后场景的概率分布和典型性来检验结果质量,并可进一步将此方法迁移至光伏发电、负荷等其他不确定性场景的建模与简化研究中。

上一篇: FSMC 驱动解析
下一篇: libc,glibc, eglibc, klibc
lamdoc
博客等级 码龄18年 155粉丝 655原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值