K510 Linux Kernel Driver Developer's Guide
Document version: V1.0.0
Published: 2022-03-09
Disclaimer The products, services or features you purchase shall be subject to the commercial contracts and terms of Beijing Canaan Jiesi Information Technology Co., Ltd. ("the Company", the same hereinafter), and all or part of the products, services or features described in this document may not be within the scope of your purchase or use. Except as otherwise agreed in the contract, the Company disclaims all representations or warranties, express or implied, as to the accuracy, reliability, completeness, marketing, specific purpose and non-aggression of any representations, information, or content of this document. Unless otherwise agreed, this document is provided as a guide for use only. Due to product version upgrades or other reasons, the contents of this document may be updated or modified from time to time without any notice.
Trademark Notices
"", "Canaan" icon, Canaan and other trademarks of Canaan and other trademarks of Canaan are trademarks of Beijing Canaan Jiesi Information Technology Co., Ltd. All other trademarks or registered trademarks that may be mentioned in this document are owned by their respective owners.
Copyright ©2022 Beijing Canaan Jiesi Information Technology Co., Ltd This document is only applicable to the development and design of the K510 platform, without the written permission of the company, no unit or individual may disseminate part or all of the content of this document in any form.
Beijing Canaan Jiesi Information Technology Co., Ltd URL: canaan-creative.com Business Enquiries: [email protected]
# preface **Document purpose** This document is a supporting document for the K510 SDK, this document mainly talks about Linux-related drivers, configuration, debugging, etcReader Objects
The main people to whom this document (this guide) applies:
- Software developers
- Technical support personnel
Revision history The revision history accumulates a description of each document update. The latest version of the document contains updates for all previous versions.
The version number | Modified by | Date of revision | Revision Notes |
---|---|---|---|
V1.0.0 | System software groups | 2022-03-09 | SDK V1.5 released |
[TOC]
The linux version currently used by sdk is 4.17.0. Linux, full name GNU/Linux, is a free-to-use and freely disseminated UNIX-like operating system with a kernel first released by Linus Bennadict Torvaz on October 5, 1991, it is mainly inspired by the ideas of Minix and Unix, and is a multi-user, multi-tasking, multi-threaded and multi-CPU-based operating system based on POSIX. It runs major Unix tool software, applications, and network protocols. It supports both 32-bit and 64-bit hardware. Linux inherits Unix's network-centric design philosophy and is a stable multi-user network operating system. Linux has hundreds of different distributions, such as community-based debian, archlinux, and commercially developed Red Hat Enterprise Linux, SUSE, Oracle Linux, etc.
For more information about the Linux kernel, please visit:https://docs.kernel.org/
Download and compile the SDK, the SDK will download and compile the Linux code when compiling.
For more information about how to download and compile the SDK, seeK510_SDK_Build_and_Burn_Guide.
- operating system
numbering | Software resources | illustrate |
---|---|---|
1 | Ubuntu | 18.04/20.04 |
- The software environment requirements are shown in the following table:
numbering | Software resources | illustrate |
---|---|---|
1 | K510 SDK | v1.5 |
Default kernel configuration file path:
arch/riscv/configs/k510_defconfig
The kernel supports two development boards, K510 CRB and EVB, and the corresponding dts files are as follows:
arch/riscv/boot/dts/canaan/k510_crb_lp3_v0_1.dts
arch/riscv/boot/dts/canaan/k510_evb_lp3_v1_1.dts
In the arch/riscv/boot/dts/canaan/k510_common directory is the soc-level public dts definition.
-
Install Andesight v3.2.1
-
Go to the ice directory under the andesight installation directory and run ICEMAN
#ICEman -Z v5 --smp
-
Using gdb debugging, here is the /dev/mem kernel code driver/char/mem.c as an example
riscv64-linux-gdb --eval-command="target remote 192.168.200.100:1111" (gdb) symbol-file vmlinux (gdb) hbreak mmap_mem
-
The application opens /dev/mem, calls mmap and enters the breakpoint
Configuration options:
CONFIG_SERIAL_8250_DW
Driver files:
/tty/serial/8250
Device Tree:
serial@96000000 {
status = "okay";
#address-cells = <0x2>;
#size-cells = <0x2>;
compatible = "snps,dw-apb-uart";
reg = <0x0 0x96000000 0x0 0x100>;
interrupt-parent = <0x6>;
interrupts = <0x1 0x4>;
resets = <0x4 0x58 0x1 0x1f 0x0>;
reset-names = "uart0_rst";
power-domains = <0x5 0x6>;
clock-frequency = <0x17d7840>;
reg-shift = <0x2>;
reg-io-width = <0x4>;
no-loopback-test = <0x1>;
pinctrl-names = "default";
pinctrl-0 = <0x1f>;
};
API: Device File Node:
/dev/ttyS0
/dev/ttyS1/2/3 #目前dts中disable
Programming interface: standard serial port driver, refer to Linux man page
man termios
Configuration options:
CONFIG_NET_CADENCE
Driver files:
drivers/net/ethernet/cadence
Device Tree:
emac@93030000 {
status = "okay";
compatible = "cdns,k510-gem";
reg = <0x0 0x93030000 0x0 0x10000>;
interrupt-parent = <0x6>;
interrupts = <0x36 0x4 0x37 0x4 0x38 0x4>;
clocks = <0x1b 0x1b 0x1b 0x1b 0x1b 0x1b>;
clock-names = "hclk", "pclk", "ether_clk", "tx_clk", "rx_clk", "tsu_clk";
clock-config = <0x97001104>;
resets = <0x4 0xe4 0x1 0x1f 0x0>;
reset-names = "emac_rst";
power-domains = <0x5 0x5>;
phy-mode = "rgmii";
pinctrl-names = "default";
pinctrl-0 = <0x1c>;
};
Device:eth0
API description: Standard Ethernet port driver, please refer to tcp/ip socket programming;
Ethernet port IP configuration:
ifconfig eth0 xxx.xxx.xxx.xxx
Configuration options:
CONFIG_MMC_SDHCI_CADENCE
Driver files:
drivers/mmc/host/sdhci-cadence.c
Device Tree:
sdio@93000000 {
status = "okay";
compatible = "socionext,uniphier-sd4hc", "cdns,sd4hc";
reg = <0x0 0x93000000 0x0 0x2000>;
interrupt-parent = <0x6>;
interrupts = <0x30 0x4>;
clocks = <0x14>;
max-frequency = <0x2faf080>;
resets = <0x4 0xc8 0x1 0x1f 0x0>;
reset-names = "sdio0_rst";
power-domains = <0x5 0x5>;
bus-width = <0x8>;
pinctrl-names = "default";
pinctrl-0 = <0x15>;
};
Devices and partitions:
[root@k510-test ~ ]$ ls -l /dev/ | grep mmcblk0
brw------- 179, 0 Jan 1 1970 mmcblk0 # emmc
brw------- 179, 8 Jan 1 1970 mmcblk0boot0
brw------- 179, 16 Jan 1 1970 mmcblk0boot1
brw------- 179, 1 Jan 1 1970 mmcblk0p1 # emmc第一个分区(boot)
brw------- 179, 2 Jan 1 1970 mmcblk0p2 # emmc第二个分区(kenrel,env,vfat)
brw------- 179, 3 Jan 1 1970 mmcblk0p3 # emmmc第三个分区(rootfs文件系统,ext2)
Driver API: Standard driver, as an ordinary file to read and write.
Configuration options:
CONFIG_MMC_SDHCI_CADENCE
Driver files:
drivers/mmc/host/sdhci-cadence.c
Device Tree:
sdio@93020000 {
status = "okay";
compatible = "socionext,uniphier-sd4hc", "cdns,sd4hc";
reg = <0x0 0x93020000 0x0 0x2000>;
interrupt-parent = <0x6>;
interrupts = <0x32 0x4>;
clocks = <0x19>;
max-frequency = <0x2faf080>;
resets = <0x4 0xd0 0x1 0x1f 0x0>;
reset-names = "sdio2_rst";
power-domains = <0x5 0x5>;
bus-width = <0x4>;
cap-sd-highspeed;
cdns,phy-input-delay-legacy = <0xf>;
cdns,phy-input-delay-sd-highspeed = <0xf>;
pinctrl-names = "default";
pinctrl-0 = <0x1a>;
};
Equipment:
[root@k510-test ~ ]$ ls -l /dev/ | grep mmcblk1
brw------- 179, 24 mmcblk1 # sd卡设备
brw------- 179, 25 mmcblk1p1 # sd卡第一个分区(boot,kenrel,env,vfat)
brw------- 179, 26 mmcblk1p2 # sd卡第二个分区(rootfs文件系统,ext2)
brw------- 179, 27 mmcblk1p3 # sd卡第三个分区(用户分区)
Driver API: Standard driver, as an ordinary file to read and write.
Configuration options:
CONFIG_DW_WATCHDOG
Driver files:
drivers/watchdog/dw_wdt.c
Device Tree:
wdt@97010000 {
status = "okay";
compatible = "snps,dw-wdt";
reg = <0x0 0x97010000 0x0 0x100>;
clocks = <0x44>;
resets = <0x4 0x40 0x2 0x0 0x3>;
reset-names = "wdt0_rst";
};
wdt@97020000 {
status = "okay";
compatible = "snps,dw-wdt";
reg = <0x0 0x97020000 0x0 0x100>;
clocks = <0x45>;
resets = <0x4 0x40 0x2 0x0 0x4>;
reset-names = "wdt1_rst";
};
wdt@97030000 {
status = "okay";
compatible = "snps,dw-wdt";
reg = <0x0 0x97030000 0x0 0x100>;
clocks = <0x46>;
resets = <0x4 0x40 0x2 0x0 0x5>;
reset-names = "wdt2_rst";
};
API: Device File Node:
/dev/watchdog
/dev/watchdog0/1/2
Programming interface: linux file IO(open, close, ioctl), see Linux man page
Kernel source code comes with documentation:Documentation/watchdog/watchdog-api.txt
Configuration options:
CONFIG_PWM_GPIO
CONFIG_PWM_CANAAN
Driver files:
drivers/pwm/pwm-canaan.c
drivers/pwm/pwm-gpio.c
Device Tree:
pwm0@970f0000 {
status = "okay";
compatible = "canaan,k510-pwm";
reg = <0x0 0x970f0000 0x0 0x40>;
clocks = <0x55>;
clock-names = "pwm";
resets = <0x4 0x40 0x2 0x0 0xb>;
reset-names = "pwm_rst";
pinctrl-names = "default";
pinctrl-0 = <0x56>;
};
pwm1@970f0000 {
status = "okay";
compatible = "canaan,k510-pwm";
reg = <0x0 0x970f0040 0x0 0x40>;
clocks = <0x55>;
clock-names = "pwm";
resets = <0x4 0x40 0x2 0x0 0xb>;
reset-names = "pwm_rst";
pinctrl-names = "default";
pinctrl-0 = <0x57>;
};
API: pwm driver in user state can be accessed through sysfs, /sys/class/pwm/
Programming interface: Linux file IO (open, read, write), see Linux man page
Kernel source code comes with documentation:Documentation/pwm.txt
Configuration options:
CONFIG_I2C_DESIGNWARE_CORE
CONFIG_I2C0_TEST_DRIVER
Driver files:
drivers/misc/canaan/i2c/test-i2c0.c
drivers/i2c/busses/i2c-designware-platdrv.c
Device Tree:
i2c@97060000 {
status = "disable";
compatible = "snps,designware-i2c";
reg = <0x0 0x97060000 0x0 0x100>;
interrupt-parent = <0x6>;
interrupts = <0xc 0x4>;
clocks = <0x48>;
clock-frequency = <0x186a0>;
resets = <0x4 0x40 0x2 0x0 0x0>;
reset-names = "i2c0_rst";
};
API: The I2C driver is a bus driver and is implemented using the Linux kernel I2C subsystem framework. User-state can be accessed through sysfs, or user-state tool programs such as i2c-tools can be used.
/sys/bus/i2c/devices/
Programming interface: Linux file IO(open, read, write), see Linux man page
Kernel source code comes with documentation:Documentation/i2c/dev-interface
Configuration options:
USB_CANAAN_OTG20
Drive:
drivers/usb/canaan_otg20/core_drv_mod
Device Tree:
usb@93060000 {
status = "okay";
compatible = "Cadence,usb-dev1.00";
reg = <0x0 0x93060000 0x0 0x10000>;
interrupt-parent = <0x6>;
interrupts = <0x2d 0x4 0x2e 0x4>;
resets = <0x4 0x18c 0x1 0x1f 0x0>;
reset-names = "usb_rst";
power-domains = <0x5 0xc>;
otg_power_supply-gpios = <0x13 0x10 0x0>;
};
USB as a host, can be attached to a U disk, as a device, can be used as a U disk.
Configuration options:
CONFIG_COMMON_CLK_CAN_K510
Driver files:
drivers/reset/canaan/reset-k510.c
Device Tree:
arch/riscv/boot/dts/canaan/k510_common/clock_provider.dtsi
arch/riscv/boot/dts/canaan/k510_common/clock_consumer.dtsi
clock_provider.dtsi
Define all clock nodes inclock_consumer.dtsi
References in each driver dts node
Configuration options:
CONFIG_CANAAN_PM_DOMAIN
Driver files:
drivers/soc/canaan/k510_pm_domains.c
Device Tree:
arch/riscv/boot/dts/canaan/k510_common/power_provider.dtsi
arch/riscv/boot/dts/canaan/k510_common/power_consumer.dtsi
sysctl_power@97003000 {
status = "okay";
compatible = "canaan, k510-sysctl-power";
reg = <0x0 0x97003000 0x0 0x1000>;
#power-domain-cells = <0x1>;
phandle = <0x5>;
};
power_provider.dtsi
The dts node of the provideder is definedinclude/dt-bindings/soc/canaan,k510_pm_domains.h
All power domains are defined inpower_consumer.dtsi
The is referenced in the drivers' respective dts nodes
Configuration options:
CONFIG_COMMON_RESET_K510
Driver files:
drivers/reset/canaan/reset-k510.c
Device Tree:
arch/riscv/boot/dts/canaan/k510_common/reset_provider.dtsi
arch/riscv/boot/dts/canaan/k510_common/reset_consumer.dtsi
sysctl_reset@97002000 {
status = "okay";
compatible = "canaan,k510-sysctl-reset";
reg = <0x0 0x97002000 0x0 0x1000>;
#reset-cells = <0x4>;
phandle = <0x4>;
};
reset_provider.dtsi
The dts node of the provideder is definedinclude/ dt-bindings/reset/canaan-k510-reset.h
All reset signals are defined inreset_consumer.dtsi
The is referenced in the drivers' respective dts nodes
Configuration options:
CONFIG_PINCTRL_K510
Driver files:
drivers/pinctrl/canaan
Related Device Tree:
arch/riscv/boot/dts/canaan/k510_common/iomux_provider.dtsi
arch/riscv/boot/dts/canaan/k510_common/iomux_consumer.dtsi
iomux@97040000 {
status = "okay";
compatible = "pinctrl-k510";
reg = <0x0 0x97040000 0x0 0x1000>;
resets = <0x4 0x40 0x2 0x0 0x9>;
reset-names = "iomux_rst";
#pinctrl-cells = <0x1>;
pinctrl-k510,register-width = <0x20>;
pinctrl-k510,function-mask = <0xffffffff>;
iomux_emac_pins {
pinctrl-k510,pins = <0x23 0x23012d 0x24 0x24012e 0x22 0x22012c 0x26 0x260132 0x20 0x20012a 0x2e 0x2e013a 0x2d 0x2d0139 0x2a 0x2a0136 0x29 0x290135 0x1d 0x1d0126>;
};
iomux_mmc0_pins {
pinctrl-k510,pins = <0x7 0x70107 0x8 0x80108 0x9 0x90109 0xa 0xa010a 0xb 0xb010b 0xc 0xc010c 0xd 0xd010d 0xe 0xe010e 0xf 0xf010f 0x10 0x100110>;
phandle = <0x15>;
};
iomux_mmc2_pins {
pinctrl-k510,pins = <0x17 0x170117 0x18 0x180118 0x19 0x190119 0x1a 0x1a011a 0x1b 0x1b011b 0x1c 0x1c011c>;
phandle = <0x1a>;
};
iomux_uart0_pins {
pinctrl-k510,pins = <0x70 0x54 0x71 0x5a>;
phandle = <0x1f>;
};
iomux_uart1_pins {
pinctrl-k510,pins = <0x72 0x64 0x73 0x6a>;
phandle = <0x20>;
};
iomux_emac_rgmii_pins {
pinctrl-k510,pins = <0x23 0x23012d 0x24 0x24012e 0x1d 0x1d0123 0x26 0x260131 0x2e 0x2e013a 0x2d 0x2d0139 0x2c 0x2c0138 0x2b 0x2b0137 0x1e 0x1e0128 0x25 0x25012f 0x2a 0x2a0136 0x29 0x290135 0x28 0x280134 0x27 0x270133>;
phandle = <0x1c>;
};
iomux_i2s_pins {
pinctrl-k510,pins = <0x64 0xab 0x65 0xad 0x63 0xa3 0x62 0x93>;
phandle = <0x22>;
};
iomux_i2c1_pins {
pinctrl-k510,pins = <0x78 0x44 0x79 0x45>;
phandle = <0x4a>;
};
iomux_i2c2_pins {
pinctrl-k510,pins = <0x67 0x46 0x66 0x47>;
phandle = <0x4d>;
};
iomux_i2c3_pins {
pinctrl-k510,pins = <0x74 0x49 0x75 0x48>;
phandle = <0x4f>;
};
iomux_i2c4_pins {
pinctrl-k510,pins = <0x30 0x4b 0x2f 0x4a>;
phandle = <0x52>;
};
iomux_dvp_pins {
pinctrl-k510,pins = <0x33 0x33013f 0x34 0x340140 0x35 0x350141 0x36 0x360142 0x37 0x370143 0x38 0x380144 0x39 0x390145 0x3a 0x3a0146 0x3b 0x3b0147 0x3c 0x3c0148 0x3d 0x3d0149 0x3e 0x3e014a 0x3f 0x3f014b 0x40 0x40014c 0x42 0x42014e>;
phandle = <0x6c>;
};
iomux_gpio_pins {
pinctrl-k510,pins = <0x20 0x20 0x22 0x1f 0x45 0xc 0x46 0xd 0x47 0xe 0x4b 0xf 0x4c 0x10 0x4d 0x11 0x4e 0x1d 0x4f 0x1e 0x50 0x14 0x51 0x15 0x53 0x16 0x54 0x17 0x55 0x18 0x61 0x19 0x7b 0x1a>;
phandle = <0x47>;
};
iomux_pwm0_pins {
pinctrl-k510,pins = <0x7e 0xb3>;
phandle = <0x56>;
};
iomux_pwm1_pins {
pinctrl-k510,pins = <0x7f 0xb7>;
phandle = <0x57>;
};
iomux_spi0_pins {
pinctrl-k510,pins = <0x56 0x560162 0x57 0x570163 0x58 0x580164 0x59 0x590165 0x5a 0x5a0166 0x5b 0x5b0167>;
phandle = <0xc>;
};
iomux_spi1_pins {
pinctrl-k510,pins = <0x68 0x8 0x69 0x9 0x6a 0x0 0x6b 0x1>;
phandle = <0xf>;
};
iomux_spi2_pins {
pinctrl-k510,pins = <0x7a 0x2a>;
phandle = <0x12>;
};
iomux_mmc1_pins {
pinctrl-k510,pins = <0x11 0x110111 0x12 0x120112 0x13 0x130113 0x14 0x140114 0x15 0x150115 0x16 0x160116>;
phandle = <0x17>;
};
};
iomux_provider.dtsi
The dts node of the provideder is defined
include/include/dt-bindings/pinctrl/k510.h
All IO function numbers are defined in
iomux_consumer.dtsi
The is referenced in the drivers' respective dts nodes
Configuration options:
CONFIG_ ALLEGRO_CODEC_DRIVER
Driver files:
drivers/media/platform/canaan/al5r
Related Device Tree:
h264@92740000 {
status = "okay";
compatible = "al,al5r";
reg = <0x0 0x92740000 0x0 0x10000>;
interrupt-parent = <0x6>;
interrupts = <0x3f 0x4>;
clocks = <0x7f>;
resets = <0x4 0x184 0x1 0x1f 0x0>;
reset-names = "h264_rst";
power-domains = <0x5 0xb>;
};
API: Device File Node: /dev/h264-codec
Programming interface: Linux file IO(open, close, ioctl), see Linux man page
Supported IOCTL commands:
#define AL_CMD_IP_WRITE_REG _IOWR('q', 10, struct al5_reg)
#define AL_CMD_IP_READ_REG _IOWR('q', 11, struct al5_reg)
#define AL_CMD_IP_WAIT_IRQ _IOWR('q', 12, int)
#define AL_CMD_IP_IRQ_CNT _IOWR('q', 13, int)
#define AL_CMD_IP_CLR_IRQ _IOWR('q', 14, int)
Sample code:package/h264_demo/src
Configuration options:
CONFIG_ K510_DSP_DRIVER
Driver files:
drivers/misc/canaan/k510-dsp
Related Device Tree:
dsp@99800000 {
status = "okay";
compatible = "k510-dsp";
reg = <0x0 0x99800000 0x0 0x80000>;
resets = <0x4 0x14 0x0 0x1e 0x0>;
reset-names = "dsp_rst";
power-domains = <0x5 0x1>;
sysctl-phy-addr = <0x97000000>;
};
API: Device File Node: /dev/k510-dsp
Programming interface: Linux file IO(open, close, ioctl), see Linux man page
Supported ioctl commands:
#define DSP_CMD_BOOT _IOWR('q', 1, unsigned long)
Sample code:
package/dsp_app/src/
package/dsp_app_evb_lp3_v1_1/src/
Configuration options:
CONFIG_ K510_GNNE_DRIVER
Driver files:
drivers/misc/canaan/gnne
Related Device Tree:
gnne@94000000 {
status = "okay";
compatible = "k510-gnne";
reg = <0x0 0x94180000 0x0 0x80000>;
interrupt-parent = <0x6>;
interrupts = <0x27 0x4>;
resets = <0x4 0x2c 0x1 0x1f 0x0>;
reset-names = "gnne_rst";
power-domains = <0x5 0x3>;
};
API: Device file node: /dev/k510-gnne Programming interface: Linux file IO(open, close, ioctl), see Linux man page Supported ioctl commands:
#define GNNE_ENABLE _IOWR('g', 1, unsigned long)
#define GNNE_RESET _IOWR('g', 2, unsigned long)
#define GNNE_DISABLE _IOWR('g', 3, unsigned long)
#define GNNE_SET_PC _IOWR('g', 4, unsigned long)
#define GNNE_SET_MEM_BASE _IOWR('g', 5, unsigned long)
#define GNNE_GET_STATUS _IOWR('g', 10, unsigned long)
#define GNNE_SET_PC_ENABLE _IOWR('g', 11, unsigned long)
#define GNNE_SET_MEM0 _IOWR('g', 12, unsigned long)
#define GNNE_SET_MEM1 _IOWR('g', 13, unsigned long)
#define GNNE_SET_MEM2 _IOWR('g', 14, unsigned long)
#define GNNE_SET_MEM3 _IOWR('g', 15, unsigned long)
#define GNNE_GET_PC _IOWR('g', 16, unsigned long)
#define GNNE_GET_CTRL _IOWR('g', 17, unsigned long)
#define GNNE_GET_DSP_INTR_MASK _IOWR('g', 18, unsigned long)
#define GNNE_GET_MEM0 _IOWR('g', 19, unsigned long)
#define GNNE_GET_MEM1 _IOWR('g', 20, unsigned long)
#define GNNE_GET_MEM2 _IOWR('g', 21, unsigned long)
#define GNNE_GET_MEM3 _IOWR('g', 22, unsigned long)
#define GNNE_GET_LOAD_STROE_PC_ADDR _IOWR('g', 23, unsigned long)
#define GNNE_GET_TCU_MFU_PC_ADDR _IOWR('g', 24, unsigned long)
#define GNNE_GET_CCR_STATUS0 _IOWR('g', 25, unsigned long)
#define GNNE_GET_CCR_STATUS1 _IOWR('g', 26, unsigned long)
#define GNNE_GET_CCR_STATUS2 _IOWR('g', 27, unsigned long)
#define GNNE_GET_CCR_STATUS3 _IOWR('g', 28, unsigned long)
Sample code:
package/nncase_demo/src/mobilenetv2
Configuration options:
CONFIG_K510_2D_DRIVER
Driver files:
drivers/media/platform/canaan/kendryte_2d.c
Related Device Tree:
twod@92720000 {
status = "okay";
compatible = "k510, kendrty_2d";
reg = <0x0 0x92720000 0x0 0x10000>;
interrupt-parent = <0x6>;
interrupts = <0x44 0x0>;
clocks = <0x6f 0x70>;
clock-names = "twod_apb", "twod_axi";
};
API: Device file node: /dev/kendryte_2d Programming interface: Linux file IO(open, close, ioctl), see Linux man page Supported ioctl commands:
#define KENDRTY_2DROTATION_90 _IOWR('k', 0, unsigned long)
#define KENDRTY_2DROTATION_270 _IOWR('k', 1, unsigned long)
#define KENDRTY_2DROTATION_INPUT_ADDR _IOWR('k', 2, unsigned long)
#define KENDRTY_2DROTATION_OUTPUT_ADDR _IOWR('k', 3, unsigned long)
#define KENDRTY_2DROTATION_GET_REG_VAL _IOWR('k', 4, unsigned long)
Configuration options:
CONFIG_CRYPTO_DEV_KENDRYTE_CRYP
Driver files:
drivers/crypto/kendryte/kendryte-aes.c
drivers/crypto/kendryte/kendryte-aes.h
drivers/crypto/kendryte/kendryte-hash.c
drivers/crypto/kendryte/kendryte-hash.h
Related Device Tree:
aes@91000000 {
status = "okay";
compatible = "canaan,k510-aes";
reg = <0x0 0x91000000 0x0 0x10000>;
clocks = <0x7>;
resets = <0x4 0x9c 0x1 0x1f 0x0>;
reset-names = "aes_rst";
power-domains = <0x5 0x4>;
dmas = <0x8 0x1 0xfff 0x0 0x21 0x8 0x1 0xfff 0x0 0x22>;
dma-names = "tx", "rx";
};
sha@91010000 {
status = "okay";
compatible = "canaan,k510-sha";
reg = <0x0 0x91010000 0x0 0x10000>;
clocks = <0x9>;
resets = <0x4 0x94 0x1 0x1f 0x0>;
reset-names = "sha_rst";
power-domains = <0x5 0x4>;
dmas = <0x8 0x1 0xfff 0x0 0x20>;
dma-names = "tx";
};
API: Device Node Files:/sys/bus/platform/devices/91000000.aes
/sys/bus/platform/devices/91010000.sha
Programming Interface: User-state programs use sockets to access the kernel's driver API, where the reference documentation is located/Documentation/crypto/userspace-if.rst
Sample code:
package/crypto_demo/src
Configuration options:
CONFIG_THERMAL
CONFIG_CANAAN_THERMAL
Driver files:
drivers/thermal/canaan_thermal.c
Related Device Tree:
tsensor@970e0300 {
status = "okay";
compatible = "canaan,k510-tsensor";
reg = <0x0 0x970e0300 0x0 0x100>;
interrupt-parent = <0x6>;
interrupts = <0x1c 0x4>;
clocks = <0x54>;
};
How to use:
cd /sys/class/thermal/thermal_zone0/
echo enabled > mode
cat temp
Configuration options:
CONFIG_KENDRYTE_TWOD_SUPPORT
CONFIG_KENDRYTE_TWOD
Driver files:
drivers/video/canaan/twod/kendryte_td.c
drivers/video/canaan/twod/kendryte_td_reg.c
drivers/video/canaan/twod/kendryte_td.h
drivers/video/canaan/twod/kendryte_td_table.h
Related Device Tree:
twod@92720000 {
status = "okay";
compatible = "k510, kendrty_2d";
reg = <0x0 0x92720000 0x0 0x10000>;
interrupt-parent = <0x6>;
interrupts = <0x44 0x0>;
clocks = <0x6f 0x70>;
clock-names = "twod_apb", "twod_axi";
};
not
Translation Disclaimer
For the convenience of customers, Canaan uses an AI translator to translate text into multiple languages, which may contain errors. We do not guarantee the accuracy, reliability or timeliness of the translations provided. Canaan shall not be liable for any loss or damage caused by reliance on the accuracy or reliability of the translated information. If there is a content difference between the translations in different languages, the Chinese Simplified version shall prevail.
If you would like to report a translation error or inaccuracy, please feel free to contact us by mail.