在Linux下交叉编译Cryptoauthlib到ARM平台下

嵌入式安全驱动库CryptoAuthLib移植与应用实战指南 在嵌入式系统开发中,硬件安全芯片(Secure Element)是构建设备可信根、实现密钥安全存储与加密运算的核心组件。其工作原理是通过独立的安全硬件环境,将敏感操作与主控MCU隔离,从而大幅提升系统整体安全等级。这一技术对于保障物联网设备、智能门锁、支付终端等产品的数据安全与身份认证具有关键价值。在实际工程中,开发者常面临如何高效、可靠地驱动安全芯片的挑战。Microchip的CryptoAuthLib驱动库通过分层架构与硬件抽象层(HAL)设计,封装了底层通信与命令细节,提供了统一的高级API,显著降低 阅读详情
AI摘要

本文介绍了如何在Linux环境下交叉编译Cryptoauthlib库到ARM平台,涉及硬件平台、安装交叉编译工具、下载编译Cryptoauthlib、运行与测试以及在应用层调用API的详细步骤。特别强调了使用Buildroot构建工具链和针对PKCS11的支持。

Cryptoauthlib是Microchip针对安全芯片发布的C语言的代码库。具有优秀的分层结构,可以很方便地移植到任意平台中。并且提供了针对常用SSL库的适配层,支持OpenSSL, MbedTLS, WolfSSL等。

目前大部分的Linux系统中使用OpenSSL,OpenSSL调用硬件SE是通过PKCS11来实现的。本文将介绍OpenSSL通过PKCS11来调用Cryptoauthlib,实现操作硬件SE的步骤。

基本的依赖关系为:
OpenSSL -> p11-kit -> libpkcs -> Cryptoauthlib

1. 硬件平台

在Arm平台下可以使用I2C或HID接口。对于嵌入式平台通常使用I2C接口直接操作安全芯片。

本文主要介绍I2C接口。

注意:安全芯片在平时处于休眠模式,不会响应I2C的操作,所以每次操作前都需要先唤醒芯片。
唤醒时序是:在SDA上发一个超过60uS的低电平,拉高后再等待1.5ms,通过器件地址比如0xC0直接读4个字节,如果是0x04, 0x11, 0x33, 0x43则说明芯片确实正确唤醒了。接下来才可以发正常需要的命令。
由于原生Linux内核不支持动态调整I2C的时钟频率,所以建议I2C时钟频率固定在100K,这样只需要通过I2C发送0x00就可以满足唤醒时序了。

由于软件的依赖关系比较复杂,强烈推荐使用Buildroot构建工具,其中已经支持了大部分的依赖库,比如openssl, openssl-engine, libp11, p11-kit, gnutls, libffi, libtasn1等。

2. 安装交叉编译工具

有两种方式安装编译工具链。

1. 使用apt自动安装

$ sudo apt-get install gcc-arm-linux-gnueabi

2. 使用buildroot搭建编译工具链

两种方式:

  • 从buildroot源码自行构建工具链
  • 安装Buildroot的SDK

通常如果需要自行定义目标板的运行库和相关工具时,需要按照需求配置目标板的运行环境。建议自行搭建builroot工具链。具体参考buildroot相关文档。

或者直接复制SDK安装文件到需要的目录下,运行解压命令即可。
解压后进入目录,运行一个shell脚本重定向编译环境。

命令如下

$ tar xzvf arm-buildroot-linux-gnueabi_sdk-buildroot.tar.gz
$ cd arm-buildroot-linux-gnueabi_sdk-buildroot
$ ./relocate-sdk.sh

3. 下载编译支持pkcs11的Cryptoauthlib库

我们需要支持pkcs11的版本, 在v3.3.0和之后的版本中,已经集成了pkcs11的功能,所以不需要专门下载这个pkcs11分支。

1. 获取cryptoauthlib最新版本

$ git clone https://github.com/MicrochipTech/cryptoauthlib

由于国内网络访问github比较慢,可以用下面的备用库

$ git clone https://gitee.com/flyerink/cryptoauthlib

2. 在源码目录下建立cmake交叉编译工具链文件arm_toolchain.cmake,具体路径需要根据自己的编译环境修改。

  1. 使用gcc-arm-linux-gnueabi工具链时
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(tools /usr)

SET(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabi-g++)
SET(CMAKE_LINKER ${tools}/bin/arm-linux-gnueabi-ld)
SET(CMAKE_NM ${tools}/bin/arm-linux-gnueabi-nm)
SET(CMAKE_OBJCOPY ${tools}/bin/arm-linux-gnueabi-objcopy)
SET(CMAKE_OBJDUMP ${tools}/bin/arm-linux-gnueabi-objdump)
SET(CMAKE_RANLIB ${tools}/bin/arm-linux-gnueabi-ranlib)
  1. 使用buildroot工具链时
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(tools /opt/arm-buildroot-linux-gnueabi_sdk-buildroot)

SET(CMAKE_C_COMPILER ${tools}/bin/arm-buildroot-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER ${tools}/bin/arm-buildroot-linux-gnueabi-g++)
SET(CMAKE_LINKER ${tools}/bin/arm-buildroot-linux-gnueabi-ld)
SET(CMAKE_NM ${tools}/bin/arm-buildroot-linux-gnueabi-nm)
SET(CMAKE_OBJCOPY ${tools}/bin/arm-buildroot-linux-gnueabi-objcopy)
SET(CMAKE_OBJDUMP ${tools}/bin/arm-buildroot-linux-gnueabi-objdump)
SET(CMAKE_RANLIB ${tools}/bin/arm-buildroot-linux-gnueabi-ranlib)

3. 测试程序中默认的I2C地址和序号

进入lib/atca_cfgs.c, 默认608A的I2C地址是0xC0, 使用Linux系统中的i2c-2设备。

如果不知道自己的板上使用的是哪个i2c时,可以用i2cdetect来检测下:

$ i2cdetect -l   #查看系统已安装的 I2C 总线列表
$ i2cdetect -y -r 1    #查询i2c-1上的设备
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: 60 -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

注意这里的I2C是7位地址表示,0xC0应该是0x60。

4. 编译生成ARM下的二进制可执行文件

$ mkdir build
$ cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE="../arm_toolchain.cmake" -DBUILD_TESTS=ON -DATCA_PKCS11=ON -DATCA_HAL_I2C=ON -DATCA_HAL_KIT_HID=OFF -DATCA_HAL_KIT_CDC=OFF -DATCA_TNGTLS_SUPPORT=ON -DATCA_TFLEX_SUPPORT=ON -DATCA_USE_ATCAB_FUNCTIONS=OFF -DATCA_PRINTF=ON ..
$ make

编译生成动态链接库和测试程序。

编译选项的说明:

  • BUILD_TESTS:这里已经把BUILD_TESTS打开了,会自动编译生成测试程序,对当前的硬件用命令行的方式访问。可以用来验证硬件是否有问题。
  • ATCA_PKCS11:我们是要编译用于PKCS11的链接库,必须打开。
  • ATCA_HAL_I2C:如果使用I2C的HAL驱动需要开启,通常是针对带有I2C接口的目标板。
  • DATCA_HAL_KIT_HID:使用USB-HID作为通信接口,通常Microchip提供的开发板都支持这种方式,包括DM320118, DM320109和AT88CK101等。
  • ATCA_HAL_KIT_CDC:用于USB To UART的开发板连接。
  • ATCA_PRINTF:如果想使用库中提供的atca_printf相关函数,可以把ATCA_PRINTF打开。

可以使用file命令检验生成的测试程序是ARM平台的二进制文件

$ file test/cryptoauth_test
test/cryptoauth_test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 5.4.0, with debug_info, not stripped

5. 复制可执行文件和生成的库以及配置文件到开发板中:

注意要修改成自己目标板的IP地址

$ scp cryptoauthlib.conf root@192.168.1.101:/etc/cryptoauthlib
$ scp ../app/pkcs11/slot.conf.tmpl root@192.168.1.101:/var/lib/cryptoauthlib
$ scp lib/libcryptoauth.so root@192.168.1.101:/usr/lib
$ scp test/cryptoauth_test root@192.168.1.101:/root

4. 运行并测试

通过SSH或串口登录到目标板,运行新下载的可执行程序cryptoauth_test。
由于板子上使用的不是默认的i2c-2, 而是用的i2c-1设备,所以命令中需要用-i i2c 1来指定接口序号。

1. 单命令行模式

运行info获取器件的版本信息

$ ./cryptoauthlib_test info -d ecc608 -i i2c 1 -a 0xC0
revision:
00 00 60 02

运行sernum获取器件的序列号

$ ./cryptoauthlib_test sernum-d ecc608 -i i2c 1 -a 0xC0
serial number:
01 23 EE 52 4A 06 FA 85 EE

2. 交互式模式

# 运行程序进入交互式命令模式
$ ./cryptoauthlib_test

# 打印帮忙信息,列出全部命令
$ help
Usage:
help - Display Menu
sha204 - Set Target Device to ATSHA204A
sha206 - Set Target Device to ATSHA206A
ecc108 - Set Target Device to ATECC108A
ecc204 - Set Target Device to ECC204
ecc508 - Set Target Device to ATECC508A
ecc608 - Set Target Device to ATECC608
ta100 - Set Target Device to TA100
info - Get the Chip Revision
sernum - Get the Chip Serial Number
rand - Generate Some Random Numbers
readcfg - Read the Config Zone
lockstat - Zone Lock Status
tng - Run unit tests on TNG type part.
wpc - Run unit tests on WPC type part.
basic - Run Basic Test on Selected Device
util - Run Helper Function Tests
clkdivm0 - Set ATECC608 to ClockDivider M0(0x00)
clkdivm1 - Set ATECC608 to ClockDivider M1(0x05)
clkdivm2 - Set ATECC608 to ClockDivider M2(0x0D)
cd - Run Unit Tests on Cert Data
cio - Run Unit Test on Cert I/O
crypto - Run Unit Tests for Software Crypto Functions
jwt - Run JWT support tests
config - Create testing handles in TA100 device
handles - Print info for stored handles in TA100 device
clear - Delete Handles
talib - Run talib tests
power - Change device power state
exit - Exit the test application

# 指定使用的器件型号,这里是ecc608
$ ecc608

# 运行info获取器件的版本信息
$ info -d ecc608 -i i2c 1 -a 0xC0
revision:
00 00 60 02

# 运行sernum获取器件的序列号
$ sernum -d ecc608 -i i2c 1 -a 0xC0
serial number:
01 23 EE 52 4A 06 FA 85 EE

5. 在应用层代码中调用API

根据自己目标板的设置来修改器件信息:

我们使用的SAM9X60开发板,608A是连接在i2c-1上, I2C时钟是100K, 所以修改如下:

/** \brief configuration for an ECCx08A device */
ATCAIfaceCfg cfg_ateccx08a_i2c = {
    .iface_type                 = ATCA_I2C_IFACE,
    .devtype                    = ATECC608A,
    {
        .atcai2c.slave_address  = 0xC0,
        .atcai2c.bus            = 1,
        .atcai2c.baud = 100000,
    },
    .wake_delay                 = 1500,
    .rx_retries                 = 20
};

int main(int argc, char* argv[])
{
	ATCA_STATUS status;

	// Inititalize CryptoAuthLib
	status = atcab_init (&cfg_ateccx08a_i2c);
	if (status != ATCA_SUCCESS) {
	    printf ("Fail...\r\n");
	    return status;
	}
	
	// Call other APIs
	
	atcab_release();
	return status;
}
嵌入式安全驱动库CryptoAuthLib实战:从架构解析到安全引导实现 在物联网和嵌入式系统中,数据安全是基础需求,而硬件安全芯片是实现这一目标的关键组件。其核心原理是通过专用硬件提供密码学运算和安全存储,从物理层面保障密钥与敏感数据的安全。这项技术的核心价值在于为资源受限的嵌入式设备提供了可信任的硬件安全根,有效防御软件攻击与物理探测。其典型应用场景包括设备身份认证、固件安全引导、安全通信(如TLS)以及防篡改数据存储。本文以Microchip的CryptoAuthLib驱动库为例,深入探讨如何高效利用此类硬件安全芯片。该库通过分层架构抽象了底层复杂操作,提供了简洁的API, 阅读详情

相关推荐

Linux工具之htop(含移植到arm-linux系统)

Linux工具之htop(含移植到arm-linux系统)

NRWHF的博客 2432

将Cryptoauthlib设置为Linux系统的PKCS11提供程序

这些说明用于将Cryptoauthlib构建、安装和配置为pkcs11提供者。 这些说明适用于带有包管理器的常用Linux系统。

FlyerInk的博客 1937

ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植

ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植 Atmel两个官方lib介绍 CryptoAuthLib简介 bitbang方式移植CryptoAuthLib 从逻辑和代码上分析CryptoAuthLib的底层驱动调用结构关系 508A 另一个小型libATECC108A-508A Library简介 Atmel两个官方lib介绍 At

HowieXue 薛永浩的博客 3万+

使用Android NDK编译Cryptoauthlib库

目前在嵌入式Android平台中,对于安全性的需求越来越多,很多客户选择Microchip的Secure Element方案,比如ATSHA204A,ATECC608或TA10x系列芯片,都要用到Microchip的安全芯片库Cryptoauthlib。不可避免地面临到如何把Cryptoauthlib编译到Android平台中。本文简单地介绍一下使用步骤。

FlyerInk的博客 867

ATECC508A芯片开发笔记(十一):NXP 平台移植ATECCx08 CryptoAuthLib库(I2C)

ATECC508A芯片开发笔记(十一):NXP 平台移植x08库(I2C) CryptoAuthLib最新库 Nxp RT10xx平台上移植CryptoAuthLib 驱动代码分析 硬件环境: Nxp的i.Mx RT1060 MCU 软件环境: cryptoauthlib-20190903 (MicroChip官网下载) 之前在Nxp平台上使用过ATECC608A,所以将CryptoAuth...

HowieXue 薛永浩的博客 9305

在Linux、Ubuntu中跨平台编译ARM(AARCH64)平台的binutils

​Binutils 是GNU提供的一组二进制工具的集合。通常,在已经安装了Linux操作系统的个人电脑上,系统就已经自带了这个工具集。但在进行嵌入式开发的时候,可能会用到支持ARM64平台的Binutils,这时就需要用到交叉编译

白马负金羁 2655

密码学应用基本概念

介绍信息安全中加解密的一些基础概念。

Austin_2020的博客 447

cryptoauthlib-main.zip_加密库

加密库源码,包含几乎所有开源的加密库。。

Linux内核编译基本流程(ARM)

笔者使用 linux-5.4.238、gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf这里简单的对内核进行配置编译一遍,这些基本上是通用的。

Fearlessness的博客 2740

用于 TPM2硬件的 PKCS#11 接口_C语言_代码_下载

PKCS #11 是一种公钥加密标准,它定义了一种从令牌/设备(如硬件安全模块 (HSM)、智能卡等)访问加密服务的标准方法。在这个项目中,我们打算使用 TPM2 设备作为加密令牌。 入门: 建造- 如何建造 初始化- 如何配置它 安装- 如何安装 示例用法 SSH - 如何通过 SSH 配置和使用它。 P11 - 如何配置和使用它与各种 P11 组件。 PKCS11-TOOL - 如何使用 OpenSC 的 pkcs11-tool 配置和使用它。 EAP-TLS - 如何使用 EAP-TLS 配置和使用它进行 Wi-Fi 身份验证。 互操作性- 与tss2-engine和 tpm2-tools项目互操作性的配置详细信息 。请注意,tpm2-tools互操作性可能涵盖使用原始编组TPM 2.0 结构的其他项目。 更多详情、使用方法,请下载后阅读README.md文件

VCSA 6.7证书过期别慌!手把手教你通过SSH修改系统时间恢复登录(附STS证书修复脚本)

本文详细介绍了VCSA 6.7证书过期的应急处理方案,包括通过SSH修改系统时间临时恢复登录、全面更新证书体系以及专项修复STS证书的实战步骤。文章还提供了后期验证和系统加固的建议,帮助运维人员有效应对证书过期问题,确保虚拟化平台的稳定运行。

weixin_31292729的博客 416

Linux中在x86架构下交叉编译ARM架构的tcpdump

提取码:kxnr解压出来添加编译器路径,这里我将交叉编译工具放置在了/opt目录下。

weixin_54706831的博客 671

AI Agent开发实战:100个真实场景题库解析

AI Agent开发涉及复杂的需求理解、架构设计及安全防护等关键技术环节。在工程实践中,开发者常面临需求偏差、系统崩溃等挑战,特别是在金融、医疗等高要求场景下。通过真实案例题库,开发者能系统性地掌握需求分析、架构决策树建模(如向量数据库选型)、安全攻防策略(如提示词注入防御)等核心技能。这些实战经验不仅能提升Agent的可用性和安全性,还能优化其在电商客服、智能家居等场景中的表现。题库采用动态难度系统,覆盖从基础到高级的开发挑战,是AI工程化落地的重要参考。

weixin_29057695的博客 347

交叉编译openssl-1.0.0生成动态库

一 编译环境说明: ubuntu虚拟机: ubuntu-16.04.6-desktop-amd64 编译工具链:arm-linux-gcc-4.5.1 二 编译过程 1 生成makefile: #./config shared --cross-compile-prefix=arm-linux- --prefix=/usr/local/openssl_arm --openssldir=/...

无我 6466

大智慧L2实时api接口的逐笔委托功能执行代码分享

用过l2行情接口的投资者应该都了解大部分的接口都是有逐笔委托功能的,那么大智慧L2实时api接口也有着很强大的逐笔委托功能,投资者可以通过这个逐笔委托功能可以看到一个股票的每天出现的全部委托指令,那么在这个逐笔委托功能里包含了委托价格、委托时间、委托量和委托方向四个要素!那么接下来小编就分享一下大智慧L2实时api接口的逐笔委托功能执行代码!那么在这里提个醒:投资者可以在大智慧L2实时api接口进行设置过滤,在逐笔委托列表里,就仅仅只会显示超过设置委托量或委托额的委托单,而不再显示小单。

Qq_2037696191的博客 3733

Mask2former自定义数据集实现滑坡语义分割

先介绍一下这次用的数据集:Bijie Landslide Dataset,是武汉大学在Triplesat卫星上裁剪的数据集,包含770张滑坡(image、mask、dem、边界坐标txt)和2003张非滑坡数据(dem、image)。直接在ade20k修改,按照路径和设置将预处理数据放好,该步骤很快就能结束,打开的图片是全黑的,因为0和1在图片上肉眼较难区分。bijie的数据集可以直接使用,接下去的步骤是1、预处理数据。配置文件修改训练类别和训练类型,由于我们分割的是滑坡,所以进行语义分割。

weixin_57812838的博客 2216

Buildroot构建指南——工具链

《Buildroot构建指南——工具链》

danshiming的博客 5158

如何打开本地网络的防火墙端口(Windows版)解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。问题

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 最开始在遇到这个报错的时候十分不解,后来经过思考,有可能是服务器端口占用,或者并没有放行。因此搜查问题的关键是要先去排查问题。 在搜索栏输入控制面板 选择防火墙 选择开关 保证这些选项是开着的 选择高级设置 新建规则 创建协议端口 选择端口 允许连接 点击下一步 创建规则后点击下一步(后命名) 选择任意端口ALL即可 问题排查完毕!socket创建网络通信时,有读者

weixin_46900108的博客 9万+

【Linux】交叉编译linux内核到ARM平台

一.环境 1.主机:ubuntu20.04 2.内核版本:linux5.11.11 3.交叉编译工具链:arm-linux-gnueabihf-gcc 4.目标平台:imx6ull主板 内核源码和交叉编译工具的下载安装不再赘述,直接上步骤 二.步骤 1.安装编译内核需要的依赖: sudo apt install libncurses5-dev sudo apt install openssl sudo apt install libssl-dev sudo apt install build-essen

徐腾腾的博客 3382

保姆级教程:从Salmon输出到DESeq2,搞定RNA-seq表达矩阵标准化与下游分析准备

本文提供从Salmon输出到DESeq2标准化的RNA-seq数据分析全流程指南,详细解析表达矩阵构建、标准化方法选择及下游分析准备。重点介绍如何将Salmon定量结果转换为DESeq2兼容格式,包括TPM与原始计数的处理技巧,以及常见问题排查方法,帮助研究人员高效完成RNA-seq数据分析。

weixin_42699679的博客 304

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3943

常用的linux+arm编译运行方法

常用的linux+arm编译运行方法分享

ligenshuai的博客 2594

【WRF-FDDA】观测 Obs nudging 的配置与使用说明(中)

WRF-FDDA

WW、forever的博客 282

Rust在linux下交叉编译到arm开发板

rust在linux实现交叉编译,编译为aarch64板子可以执行的文件

weixin_70160196的博客 4434

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Linux-ARM】安装 arm-linux-gnueabihf 交叉编译openssl-arm静态库与动态库

目录一、编译环境1.1 openssl版本1.2 下载openssl源码1.3 交叉编译器:arm-linux-gnueabihf 二、安装安装 arm-linux-gnueabihf 交叉编译器2.1 交叉编译器源码下载2.2 交叉编译器安装2.3安装相关库2.4 交叉编译器验证三、交叉编译openssl-arm静态库与动态库3.1 相关配置3.2 make depend3.3 make编译3.4 编译结果 3.5 拷贝ssl、crypto静态库和动态库3.6 也可以将openssl 安装至配置过的目录

风浪云HH的博客 1万+

深度学习工具包 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")

在Ubuntu中搭建嵌入式Linux开发环境

如果网盘链接无效了,可以加QQ群联系我们:341014981我们也正在(2022.10.17开始)使用纯粹的Ubuntu环境开始教驱动入门,免费的,感兴趣者也加上面的群。如果你使用我们的Ubuntu镜像,那么可以略过前面第1~6章的内容,直接从第7章开始看。

韦东山嵌入式专栏 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 将Cryptoauthlib设置为Linux系统的PKCS11提供程序
下一篇: 给SAM9X60安装Debian系统
FlyerInk
博客等级 码龄10年 187粉丝 8原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值