2410上NAND的初始化及驱动流程

s3c2410 datasheet 免积分下载 立即下载

2410上NAND的初始化及驱动流程

一 NAND设备及资源的定义和注册

我们通过MACHINE_START定义了smdk2410的machine_desc对象,这个对象里面有个init_machine的函数指针, 这里指向smdk_machine_init(), 我们的NAND设备就是在这个函数里注册到系统的.

void __init smdk_machine_init(void)

{

   ….

   s3c_device_nand.dev.platform_data = &smdk_nand_info;

   platform_add_device(smdk_devs, ARRAY_SIZE(smdk_devs));  //这里就把设备注册到系统里去了

   …

}

Static struct platform_device __initdata *smdk_devs[] =

{

   &s3c_device_nand,    //这样在上面的函数里我们的nand设备就注册好了.

   ...   

}

其他设备我们也可以在这里注册进系统.

struct platform_device s3c_device_nand =

{

   .name = “s3c2410-nand”,  /*名字很重要*/

   .id = -1,

   . num_resources = ARRAY_SIZE(s3c_nand_resource),

   .resource = s3c_nand_resource,  //这个是NAND占用的资源.

};

Static struct s3c2410_platform_nand smdk_nand_info = {

     .tacks = 20,      /*在datasheet上有描述*/

     .twrph0 = 60,    /*在datasheet上有描述*/

     .twrph1 = 20,    /*在datasheet上有描述*/

     .nr_sets = ARRAY_SIZE(smdk_nand_sets),

     .sets = smdk_nand_sets 

}

static struct s3c2410_nand_set smdk_nand_sets[] = {

    [0] = {

        .name       = "NAND",

        .nr_chips   = 1,

        .nr_partitions  = ARRAY_SIZE(smdk_default_nand_part),

        .partitions = smdk_default_nand_part,   /*nand的分区信息*/

    },

};

/*分区信息, 我们可以在这里修改分区内容*/

static struct mtd_partition smdk_default_nand_part[] = {

    [0] = {

        .name   = "Boot Agent",

        .size   = SZ_16K,

        .offset = 0,

    },

    [1] = {

        .name   = "S3C2410 flash partition 1",

        .offset = 0,

        .size   = SZ_2M,

    },

    [2] = {

        .name   = "S3C2410 flash partition 2",

        .offset = SZ_4M,

        .size   = SZ_4M,

    },

    [3] = {

        .name   = "S3C2410 flash partition 3",

        .offset = SZ_8M,

        .size   = SZ_2M,

    },

    [4] = {

        .name   = "S3C2410 flash partition 4",

        .offset = SZ_1M * 10,

        .size   = SZ_4M,

    },

    [5] = {

        .name   = "S3C2410 flash partition 5",

        .offset = SZ_1M * 14,

        .size   = SZ_1M * 10,

    },

    [6] = {

        .name   = "S3C2410 flash partition 6",

        .offset = SZ_1M * 24,

        .size   = SZ_1M * 24,

    },

    [7] = {

        .name   = "S3C2410 flash partition 7",

        .offset = SZ_1M * 48,

        .size   = SZ_16M,

    }

};

这样NAND设备(连同设备的详细信息)就注册进了系统, 以后在nand的驱动注册后就会probe到并使用这里定义的资源信息.

 

二 NAND驱动流程

   2410的驱动实现在driver/mtd/nand/S3c2410.c里

   首先和其他驱动一样先通过module_init(), module_exit()注册一个初始化/卸载函数,

module_init(s3c2410_nand_init);

module_exit(s3c2410_nand_exit);

系统初始化时该函数被调用

 static int __init s3c2410_nand_init(void)

{

    printk("S3C24XX NAND Driver, (c) 2004 Simtec Electronics/n");

 

    platform_driver_register(&s3c2412_nand_driver);  /*注册nand驱动*/

    platform_driver_register(&s3c2440_nand_driver);  /*注册nand驱动*/

    return platform_driver_register(&s3c2410_nand_driver);  /*注册nand驱动*/

}

从上面可以看到我们注册了3个驱动程序, 但在系统probe时它只会匹配到s3c2410_nand_driver的驱动, 因为各个驱动的名字是不一样的, 而系统是安名字来probe的.

static struct platform_driver s3c2410_nand_driver = {

    .probe      = s3c2410_nand_probe,

    .remove     = s3c2410_nand_remove,

    .suspend    = s3c24xx_nand_suspend,

    .resume     = s3c24xx_nand_resume,

    .driver     = {

        .name   = "s3c2410-nand",  /*这里的名字一定要与设备定义的名字相同*/

        .owner  = THIS_MODULE,

    },

};

当系统probe到我们刚才注册的nand设备后即调用s3c2410_nand_probe函数

static int s3c2410_nand_probe(struct platform_device *dev)

{

    return s3c24xx_nand_probe(dev, TYPE_S3C2410);

}

static int s3c24xx_nand_probe(struct platform_device *pdev, /*nand设备,前面已经列出*/

                              enum s3c_cpu_type cpu_type /*TYPE_S3C2410*/)

{

    struct s3c2410_platform_nand *plat = to_nand_plat(pdev);/*对照前面列出的设备定义来看*/

    struct s3c2410_nand_info *info;

    struct s3c2410_nand_mtd *nmtd;

    struct s3c2410_nand_set *sets;

    struct resource *res;

    int err = 0;

    int size;

    int nr_sets;

    int setno;

 

    pr_debug("s3c2410_nand_probe(%p)/n", pdev);

 

/*该变量用来保存nand详细信息,以后访问nand信息都将从这个变量里得到*/

    info = kmalloc(sizeof(*info), GFP_KERNEL);

if (info == NULL) {

        dev_err(&pdev->dev, "no memory for flash info/n");

        err = -ENOMEM;

        goto exit_error;

    }

 

    memzero(info, sizeof(*info));

    platform_set_drvdata(pdev, info);

 

    spin_lock_init(&info->controller.lock);  /*自选锁初始化*/

    init_waitqueue_head(&info->controller.wq);  /*等待队列初始化*/

 

    /* get the clock source and enable it */

    info->clk = clk_get(&pdev->dev, "nand");  /*获取用于nand的clock(nand也要时钟信号的哦)*/

    if (IS_ERR(info->clk)) {

        dev_err(&pdev->dev, "failed to get clock");

        err = -ENOENT;

        goto exit_error;

    }

 

    clk_enable(info->clk); /*使能该clock,实际上就是设置CLKCON的第四位(详见2410datasheet)*/

 

    /* allocate and map the resource */

    /* currently we assume we have the one resource */

    res  = pdev->resource;  /*nand资源,见前面的定义*/

    size = res->end - res->start + 1;

 

     /*

* 请求指定的memory区域(实际上是nand的寄存器区域), 这是物理内存, 实际上只是检测该区域

* 是否空闲的

*/

    info->area = request_mem_region(res->start, size, pdev->name);

 

    if (info->area == NULL) {

        dev_err(&pdev->dev, "cannot reserve register region/n");

        err = -ENOENT;

        goto exit_error;

    }

 

    /*保存nand信息*/

    info->device     = &pdev->dev;

    info->platform   = plat;

/*虚实地址映射,以后程序里就可以直接访问nand的寄存器了*/

    info->regs       = ioremap(res->start, size); 

    info->cpu_type   = cpu_type;

 

    if (info->regs == NULL) {

        dev_err(&pdev->dev, "cannot reserve register region/n");

        err = -EIO;

        goto exit_error;

    }

 

    dev_dbg(&pdev->dev, "mapped registers at %p/n", info->regs);

 

    /* initialise the hardware */

 

    err = s3c2410_nand_inithw(info, pdev);  /*初始化nand硬件设备*/

    if (err != 0)

        goto exit_error;

 

    /*接下来是MTD方面的初始化*/

    sets = (plat != NULL) ? plat->sets : NULL;

    nr_sets = (plat != NULL) ? plat->nr_sets : 1;

 

    info->mtd_count = nr_sets;

 

    /* allocate our information */

    size = nr_sets * sizeof(*info->mtds);

    info->mtds = kmalloc(size, GFP_KERNEL);

    if (info->mtds == NULL) {

        dev_err(&pdev->dev, "failed to allocate mtd storage/n");

        err = -ENOMEM;

        goto exit_error;

    }

 

    memzero(info->mtds, size);

 

    /* initialise all possible chips */

 

    nmtd = info->mtds;

 

    for (setno = 0; setno < nr_sets; setno++, nmtd++) {

        pr_debug("initialising set %d (%p, info %p)/n", setno, nmtd, info);

        

         /*初始化nand chip实例*/

        s3c2410_nand_init_chip(info, nmtd, sets);

       

        /*初始化mtd及相关信息,详情可参考MTD的源码*/

        nmtd->scan_res = nand_scan(&nmtd->mtd, (sets) ? sets->nr_chips : 1) ;

 

        if (nmtd->scan_res == 0) {

            s3c2410_nand_add_partition(info, nmtd, sets);  /*添加分区,详情参看MTD*/

        }

 

        if (sets != NULL)

            sets++;

    }

 

    if (allow_clk_stop(info)) {

        dev_info(&pdev->dev, "clock idle support enabled/n");

        clk_disable(info->clk);

    }

 

    pr_debug("initialised ok/n");

    return 0;

 

 exit_error:

    s3c2410_nand_remove(pdev);

 

    if (err == 0)

        err = -EINVAL;

    return err;

}

这个函数是最关键的, 要要给nand设备进行很多初始化的工作,并保存nand的所有详细信息,便于以后使用, 详细功能已在函数里描述了. clock方面的内容会有专门的文章讲解

/* nand控制器的初始化 */

static int s3c2410_nand_inithw(struct s3c2410_nand_info *info,

                   struct platform_device *pdev)

{

    struct s3c2410_platform_nand *plat = to_nand_plat(pdev);

    unsigned long clkrate = clk_get_rate(info->clk); /*nand时钟主频*/

    int tacls_max = (info->cpu_type == TYPE_S3C2412) ? 8 : 4;

    int tacls, twrph0, twrph1;

    unsigned long cfg = 0;

 

    /* calculate the timing information for the controller */

 

    clkrate /= 1000;   /* turn clock into kHz for ease of use */

 

    /*计算各时钟频率, 这些时钟参数可参考2410的datasheet*/

    if (plat != NULL) {

        tacls = s3c_nand_calc_rate(plat->tacls, clkrate, tacls_max);

        twrph0 = s3c_nand_calc_rate(plat->twrph0, clkrate, 8);

        twrph1 = s3c_nand_calc_rate(plat->twrph1, clkrate, 8);

    } else {

        /* default timings */

        tacls = tacls_max;

        twrph0 = 8;

        twrph1 = 8;

    }

 

    if (tacls < 0 || twrph0 < 0 || twrph1 < 0) {

        dev_err(info->device, "cannot get suitable timings/n");

        return -EINVAL;

    }

 

    dev_info(info->device, "Tacls=%d, %dns Twrph0=%d %dns, Twrph1=%d %dns/n",

           tacls, to_ns(tacls, clkrate), twrph0, to_ns(twrph0, clkrate), twrph1, to_ns(twrph1, clkrate));

 

    switch (info->cpu_type) {

    case TYPE_S3C2410:

        cfg = S3C2410_NFCONF_EN;  /*使能*/

        cfg |= S3C2410_NFCONF_TACLS(tacls - 1);

        cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);

        cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);

        break;

 

    case TYPE_S3C2440:

    case TYPE_S3C2412:

        cfg = S3C2440_NFCONF_TACLS(tacls - 1);

        cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);

        cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);

 

        /* enable the controller and de-assert nFCE */

 

        writel(S3C2440_NFCONT_ENABLE, info->regs + S3C2440_NFCONT);

    }

 

    dev_dbg(info->device, "NF_CONF is 0x%lx/n", cfg);

 

    /*把使能参数,时钟参数设到寄存器NFCONF里*/

    writel(cfg, info->regs + S3C2410_NFCONF);  

    return 0;

}

/*

* 为每个nand chip初始化一个实例.

* 比较简单,就是初始化各种参数和函数指针,以后会用到

*/

static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,

                   struct s3c2410_nand_mtd *nmtd,

                   struct s3c2410_nand_set *set)

{

    struct nand_chip *chip = &nmtd->chip;

    void __iomem *regs = info->regs;

   

    chip->write_buf    = s3c2410_nand_write_buf;

    chip->read_buf     = s3c2410_nand_read_buf;

    chip->select_chip  = s3c2410_nand_select_chip;

    chip->chip_delay   = 50;

    chip->priv     = nmtd;

    chip->options      = 0;

    chip->controller   = &info->controller;

 

    switch (info->cpu_type) {

    case TYPE_S3C2410:

        chip->IO_ADDR_W = regs + S3C2410_NFDATA;

        info->sel_reg   = regs + S3C2410_NFCONF;

        info->sel_bit   = S3C2410_NFCONF_nFCE;

        chip->cmd_ctrl  = s3c2410_nand_hwcontrol;

        chip->dev_ready = s3c2410_nand_devready;

        break;

 

    case TYPE_S3C2440:

        chip->IO_ADDR_W = regs + S3C2440_NFDATA;

        info->sel_reg   = regs + S3C2440_NFCONT;

        info->sel_bit   = S3C2440_NFCONT_nFCE;

        chip->cmd_ctrl  = s3c2440_nand_hwcontrol;

        chip->dev_ready = s3c2440_nand_devready;

        break;

 

    case TYPE_S3C2412:

        chip->IO_ADDR_W = regs + S3C2440_NFDATA;

        info->sel_reg   = regs + S3C2440_NFCONT;

        info->sel_bit   = S3C2412_NFCONT_nFCE0;

        chip->cmd_ctrl  = s3c2440_nand_hwcontrol;

        chip->dev_ready = s3c2412_nand_devready;

 

        if (readl(regs + S3C2410_NFCONF) & S3C2412_NFCONF_NANDBOOT)

            dev_info(info->device, "System booted from NAND/n");

 

        break;

    }

 

    chip->IO_ADDR_R = chip->IO_ADDR_W;

 

    nmtd->info     = info;

    nmtd->mtd.priv     = chip;

    nmtd->mtd.owner    = THIS_MODULE;

    nmtd->set      = set;

 

    if (hardware_ecc) {

        chip->ecc.calculate = s3c2410_nand_calculate_ecc;

        chip->ecc.correct   = s3c2410_nand_correct_data;

        chip->ecc.mode      = NAND_ECC_HW;

        chip->ecc.size      = 512;

        chip->ecc.bytes     = 3;

        chip->ecc.layout    = &nand_hw_eccoob;

 

        switch (info->cpu_type) {

        case TYPE_S3C2410:

            chip->ecc.hwctl     = s3c2410_nand_enable_hwecc;

            chip->ecc.calculate = s3c2410_nand_calculate_ecc;

            break;

 

        case TYPE_S3C2412:

        case TYPE_S3C2440:

            chip->ecc.hwctl     = s3c2440_nand_enable_hwecc;

            chip->ecc.calculate = s3c2440_nand_calculate_ecc;

            break;

 

        }

    } else {

        chip->ecc.mode      = NAND_ECC_SOFT;

    }

}

Nand驱动剩下的就是实现上面这个函数里初始化的各个函数指针了.而这些函数就是实实在在的对nand硬件的操作了, 大家可以对照着2410的nand部分的datasheet来看这些代码

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/yylklshmyt20090217/archive/2010/01/28/5265844.aspx

(Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版 (Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版 阅读详情

相关推荐

[ESP32]:基于esp-modbus实现serial主机

[ESP32]:基于esp-modbus实现serial主机

LINKKEEE的博客 2568

Nand Flash -详述4

【内存技术设备,MTD(Memory Technology Device)】 MTD,是Linux的存储设备中的一个子系统。其设计此系统的目的是,对于内存类的设备,提供一个抽象层,一个接口,使得对于硬件驱动设计者来说,可以尽量少的去关心存储格式,比如FTL,FFS2等,而只需要去提供最简单的底层硬件设备的读/写/擦除函数就可以了。而对于数据对于上层使用者来说是如何表示的,硬件驱动设计者可以不关心

学无止境 1412

BK3296蓝牙音频SoC深度评测:如何用这颗芯片打造超低功耗TWS耳机?

本文深度评测BK3296蓝牙音频SoC在TWS耳机中的应用,重点解析其22nm工艺带来的超低功耗优势(A2DP模式仅2.8mA)和3×3mm封装设计。通过芯片架构分析、双麦降噪调优及开发套件使用指南,为工程师提供打造高性能TWS耳机的完整解决方案,显著提升续航和音频质量。

rice5的博客 656

linux NAND驱动之六:NAND驱动的probe流程

由前面的说明可知,我们在要对NAND 芯片进行实际操作前已经为struct mtd_info 、struct mtd_partition 和struct nand_chip 这三个结构体分配好了内存,接下来就要为它们做一些初始化工作。 其中,我们需要为struct mtd_info 所做的初始化工作并不多,因为MTD Core 会在稍后为它做很多初始化工作(这些工作在nand_scan_tail这

流年偷换的专栏 1820

避开这些坑!智鼎MAP性格测试高分指南(附互联网/国企/外企答题模板)

本文深入解析智鼎MAP职业性格测试的核心逻辑与常见陷阱,提供针对互联网、国企、外企三大行业的差异化答题策略与实战模板。帮助求职者理解测试本质,避开追求完美人设、忽视程度副词等心理陷阱,塑造与目标岗位高度匹配的职业画像,从而在招聘关键环节脱颖而出。

rainy的博客 996

基于 Simulink 的**单相全桥 LLC 谐振双向 DC-DC 变换器(带软开关特性)**实战教程

原边(Primary):全桥逆变电路(4个 MOSFET/IGBT),将直流斩波为高频方波。变压器:提供电气隔离和电压变比。副边(Secondary):全波或全桥整流电路(同步整流或二极管)。

xiaoheshang_123的博客 54

NandFlash详述【转】

NandFlash详述 转自:http://wenku.baidu.com/view/04d9330bb52acfc789ebc92f.html?re=view 1. 硬件特性: 【Flash的硬件实现机制】 Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory...

weixin_33814685的博客 282

第三篇:NVIDIA cuOpt Python API 详解:LP、QP、MILP 建模与求解,附核心术语名词解释

NVIDIA cuOpt是一款GPU加速的优化求解库,支持LP、QP、MILP和路径优化问题。本文详细介绍了其Python API使用方法,包括核心类Problem的变量定义、约束添加、目标设置和求解配置,并提供了术语解释。cuOpt通过GPU并行计算大幅提升大规模优化问题的求解效率,支持多种求解算法和参数配置,适用于需要高性能计算的优化场景。安装方式包含pip和Docker两种,验证安装后即可快速开始建模求解。

算法工程师 236

嵌入式Linux——nand flash驱动开发(二):框架介绍

        在写这篇文章之前我想声明一下,由于我在写这篇文章之前看了一些写nand flash的文章。所以如果我的文章中出现您的文章中所有的东西,请您指出,我会细心改正或删除,而如果我的文章对你有帮助这是我的荣幸。         下面言归正传讲nand flash的框架,而好像所有的文章在介绍nand flash框架的时候总是离不开一张图:     下面我们就从这张图说起。    ...

静祥阁 1397

【例1896】report all clearance datasets 报告所有间隙数据集

report all clearance datasets 报告所有间隙数据集》这是一个NX二次开发官方小例子,下面是代码和解析。相较于混乱、未经验证的代码,官方案例能够确保开发者获得准确的开发方法,这些官方示例代码经过严格测试,能够正确地反映出NX软件的功能和API使用方式,有助于开发者系统地掌握NX二次开发技能,提高开发质量和效率。本专栏订阅后是永久阅读的。欢迎一起学习NX二次开发案例,逐步积累宝贵的经验,早日成为行业专家。

王牌飞行员_里海的博客 644

机器学习实战7-基于机器学习算法预测相亲成功率

大家好,我是微学AI,今天给大家介绍一下机器学习实战7-基于机器学习算法预测相亲成功率,随着社会的发展,大家都忙于事业,对自己的终身大事就耽搁了,相亲是一种传统的寻找伴侣的方式,随着时代的发展,相亲的方式也在不断地改变。在这个过程中,了解相亲双方的信息以及预测相亲是否成功变得越来越重要。本文将介绍如何使用随机森林算法对相亲成功进行预测,通过分析男女双方的房子、车子、长相、家庭条件、父母情况、生活习惯、学历、性格、兴趣等因素,来预测相亲是否成功。

微学AI的博客 3034

SSD nand 操作命令和时延

SSD nand 常用命令和时延

guanger__的博客 555

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1350

Linux 下 Nand Flash 驱动说明

注册 driver_register 通过 module_init(s3c2410_nand_init);注册 Nand Flash 驱动. 在 s3c2410_nand_init ()中通过 driver_register()注册 s3c2410_nand_driver 驱动程序,如下所示: static struct device_driver s3c2410_nand_drive...

weixin_30480651的博客 131

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

第19课:nand flash驱动

1、参考自带的nand flash驱动,位于drivers/mtd/nand/s3c2410.c中 1.1 为什么nand在mtd目录下? 因为mtd(memory technology device存储技术设备)是用于访问memory设备(ROM、flash )的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。 1.2首先来看s3c2410.c的入口函数: static int __init ...

赶紧十八丶 2876

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

linux flash驱动分析,Linux NAND FLASH驱动代码分析

FLASH驱动在嵌入式系统中有着举足轻重的位置,而目前市场上NAND FLASH的价格又要便宜与NOR FLASH,随着越来越多的平台支持从NAND FLASH中启动,掌握NAND flash的驱动编写有着重要的现实意义,由于内核已经完成了大部分的工作,实际工作中大部分工程师对NAND FLASH驱动只是简单的修改,对其工作原理并不太清楚,下面我们来分析一下NAND FLASH的代码流程,从中体会...

weixin_35456296的博客 251

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

mini2440 NAND FLASH 驱动-----内核是2.6.32.2

/* 参考下面两个驱动程序: drivers\mtd\nand\s3c2410.c drivers\mtd\namd\At91_nand.c */ #include #include #include #include #include #include #include #include #include #include #include #include #inc

Do one thing at a time, and do well. 692

arm 驱动进阶:nand flash 驱动程序设计

nand flash 驱动内核实现分析过程: analysis code s3c2410_nand_inithw s3c2410_nand_init_chip nand_scan // drivers/mtd/nand/nand_base.c 根据nand_chip的底层操作函数识别NAND FLASH,构造mtd_info nand_scan_ident ...

355

arm-linux东东之nand之一:nand 初始化

一,nand 初始化:环境:linux2.6.26,S3C2440  在LINUX中NAND驱动是在DRIVERS/MTD目录中.Makefile指示 nand 是构架在MTD之上的.而MTD有字驱动,块驱动之分,还有一个是分区.而NAND是块驱动.多数的NAND是512为一个寻址单位.以32个512为一个block.这是从Makefile开始obj-$(CONFIG_MTD)

qiuhuafeng的专栏 833

Linux NAND FLASH驱动代码分析

作者:范一航,华清远见深圳高级讲师FLASH驱动在嵌入式系统中有着举足轻重的位置,而目前市场上NAND FLASH的价格又要便宜与NOR FLASH,随着越来越多的平台支持从NAND FLASH中启动,掌握NAND flash的驱动编写有着重要的现实意义,由于内核已经完成了大部分的工作,实际工作中大部分工程师对NAND FLASH驱动只是简单的修改,对其工作原理并不太清楚,下面我们来分析一

华清远见 | 程序员的学习天堂 832

hisi spi nand flash驱动理解

flash 驱动流程 /* chip 函数需要自己实现,没办法由mtd提供 */ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, 785 struct s3c2410_nand_mtd *nmtd, 786 struct s3c2410_nand_set *set) 787 { 788 struct nand_chip *chip

raoxu1154492168的博客 1043

基于MTD的NANDFLASH设备驱动底层实现原理分析 三

实在写不下去了,仔细的想了一想还是把mtd/nand/s3c2410.c好好的分析分析 在Linux中NANDFLASH设备驱动是被注册成平台驱动的。我还是从函数的入口出发一步一个脚印的分析。突然间发现这些代码真的很经典 由于这一次CPU是S3C2440所以分析过程中会把其他的CPU去掉 七、mtd/nand/s3c2410.c函数的解析 1、函数中出现的几个结构体

bugouyonggan的专栏 1006

Nand Flash驱动程序编写(linux 3.4.2内核)

参考文件 drivers\mtd\nand\s3c2410.c(当内核启动时,会打印相关nand的信息,搜索相关打印信息,找到这个文件) 内核提供的nand flash 驱动例子,从这个例子中我们可以总结出nand flash 的框架,进而总结出如何写一个nand_flash驱动程序。 (1)内核源代码中支持s3c开发板的nand flash 驱动程序分析。 s3c2410...

简单博客 481

Linux下Nand Flash 驱动代码分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33811539的博客 102
上一篇: linux2.6驱动编程第一例:hello,world的实现步骤
下一篇: Linux 2.6 字符设备驱动程序
willand1981
博客等级 码龄18年 136粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值