diff --git a/hi-dev/externed_device_sample/Makefile b/hi-dev/externed_device_sample/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..069c38593b7ec3cac1a5675ae5e47b0eba3c38d0 --- /dev/null +++ b/hi-dev/externed_device_sample/Makefile @@ -0,0 +1,30 @@ +export TOP_DIR=$(CURDIR) +export SCRIPTS_DIR=$(TOP_DIR)/scripts +export OUTPUT_DIR=$(TOP_DIR)/output +export CROSS_COMPILE ?= aarch64-openeuler-linux- + +export CC=$(CROSS_COMPILE)gcc + +targets = $(shell find -maxdepth 1 -type d ! -name ".*" | grep -v "scripts\|output\|Licenses\|tmp\|mpp") + +build: + echo "CROSS_COMPILE:$(CROSS_COMPILE)" + @for dir in $(targets); do \ + if [ -f $(TOP_DIR)/$$dir/Makefile ]; then \ + cd $(TOP_DIR)/$$dir && $(MAKE); \ + fi; \ + done + +$(targets): + echo "CROSS_COMPILE:$(CROSS_COMPILE)" + cd $(TOP_DIR)/$@ && $(MAKE); + +clean: + @for dir in $(targets); do \ + if [ -f $(TOP_DIR)/$$dir/Makefile ]; then \ + cd $(TOP_DIR)/$$dir && $(MAKE) clean; \ + fi; \ + done + rm -rf $(OUTPUT_DIR) + +.PHONY:build clean $(targets) diff --git a/hi-dev/externed_device_sample/README.md b/hi-dev/externed_device_sample/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0719aa3c1d4af0266a879c4590ce32f79d6c3797 --- /dev/null +++ b/hi-dev/externed_device_sample/README.md @@ -0,0 +1,57 @@ +# externed_device_sample + +#### 介绍 +欧拉派海鸥系列驱动测试程序.其中mpp为媒体相关sample,other为非媒体相关sample。 + +## 编译说明 +测试工程有两种编译方式。 +1)通过yocto工程构建文件系统。 + [构建方法](https://openeuler.gitee.io/yocto-meta-openeuler/master/bsp/arm64/hieulerpi/hieulerpi.html) + +2)在x86的Ubuntu服务器搭建交叉编译环境进行编译。 + +2.1)下载并安装交叉编译工具链 +``` +假设当前目录/home/xxx/ +wget http://121.36.84.172/dailybuild/EBS-openEuler-23.09/EBS-openEuler-23.09/embedded_img/aarch64/aarch64-qemu/openeuler-glibc-x86_64-openeuler-image-aarch64-qemu-aarch64-toolchain-23.09.sh + +注意:请使用欧拉文件系统构建配套的交叉编译工具链。 + +mkdir toolchain +./openeuler-glibc-x86_64-openeuler-image-aarch64-qemu-aarch64-toolchain-23.09.sh +openEuler Embedded(openEuler Embedded Reference Distro) SDK installer version 23.09 +=================================================================================== +Enter target directory for SDK (default: /opt/openeuler/oecore-x86_64): /home/xxx/toolchain +You are about to install the SDK to "/home/robot/hirobot_support/toolchain". Proceed [Y/n]? y +Extracting SDK.......................done +Setting it up...SDK has been successfully set up and is ready to be used. +Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g. + $ . /home/xxx/toolchain/environment-setup-aarch64-openeuler-linux +``` + +2.2)交叉工具链生效 + +``` +cd /home/xxx/toolchain/ +. environment-setup-aarch64-openeuler-linux +``` + +2.3)下载本工程以及驱动需要的头文件和库并编译(编译二进制在当前目录的output目录下) + +``` +git clone https://gitee.com/HiEuler/externed_device_sample.git +git clone https://gitee.com/HiEuler/hardware_driver.git +mkdir -p externed_device_sample/mpp/out +cp hardware_driver/drivers/lib.tar.gz externed_device_sample/mpp/out/ +cp hardware_driver/drivers/include.tar.gz externed_device_sample/mpp/out/ +cd externed_device_sample/mpp/out/ +tar -zxvf lib.tar.gz +tar -zxvf include.tar.gz +cd - +cd externed_device_sample/ +make +``` + +#### sample使用说明 +参考每个sample的README.md + diff --git a/hi-dev/externed_device_sample/can/Makefile b/hi-dev/externed_device_sample/can/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..29ec32af6999bf5f414da94e6835a83f6a747442 --- /dev/null +++ b/hi-dev/externed_device_sample/can/Makefile @@ -0,0 +1,14 @@ +.SUFFIXES:.c .o +CC=gcc +SRCS=can_tof.c +OBJS=$(SRCS:.c=.o) +EXEC=libcan.so +all:$(OBJS) + $(CC) -shared -o $(EXEC) $(OBJS) +.c.o: + $(CC) -Wall -g -fPIC -o $(@) -c $< +clean: + rm -f $(OBJS) + rm -f core* + + diff --git a/hi-dev/externed_device_sample/can/README.assets/image-20240201144537828.png b/hi-dev/externed_device_sample/can/README.assets/image-20240201144537828.png new file mode 100644 index 0000000000000000000000000000000000000000..d620410b1a9bd74c9fdf90b6812fac085fa16f5d Binary files /dev/null and b/hi-dev/externed_device_sample/can/README.assets/image-20240201144537828.png differ diff --git a/hi-dev/externed_device_sample/can/README.assets/image-20240201144951481.png b/hi-dev/externed_device_sample/can/README.assets/image-20240201144951481.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e82370d746631c4784a1b09f3236fde118b731 Binary files /dev/null and b/hi-dev/externed_device_sample/can/README.assets/image-20240201144951481.png differ diff --git a/hi-dev/externed_device_sample/can/README.md b/hi-dev/externed_device_sample/can/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7c2374a689b1e645789beb534880a8578531401c --- /dev/null +++ b/hi-dev/externed_device_sample/can/README.md @@ -0,0 +1,50 @@ +# CAN + +## 一 例程简介 + +CAN例程为tof距离数据接收 + +## 二 测试环境说明 + +### 1)硬件准备 + +- 欧拉派 +- TOF + +### 2)软件环境 + +无 + +### 三 硬件连接 + +如图所示为CAN信号的接线端子,CAN H L信号的顺序为左L 右H + +![image-20240201144537828](./README.assets/image-20240201144537828.png) + +与TOF的连接如图所示,TOF的H线和欧拉派的CAN_H对应,TOF的L线和欧拉派的CAN_L对应,TOF的GND连接在欧拉派40Pin排针的GND上,TOF的5v供电连接在欧拉派40pin排针的5V上 + +![image-20240201144951481](./README.assets/image-20240201144951481.png) + +## 四 例程运行说明 + +在开始测试前需要将can网卡节点开启,在欧拉派的终端上执行如下命令 + +```c +ip link set can0 type can bitrate 500000 +ip link set can0 up +``` + +__TOF数据接收测试__ + +使用 can_tof命令进行接收测试,在欧拉派的终端上执行 + +```C +./can_tof +``` + +应用开启后持续接收TOF发送的距离数据并打印到欧拉派终端,使用ctrl+c结束接收 + + + + + diff --git a/hi-dev/externed_device_sample/can/can_api.py b/hi-dev/externed_device_sample/can/can_api.py new file mode 100644 index 0000000000000000000000000000000000000000..385b7420d909cc385f09898bc691040d4acc21dd --- /dev/null +++ b/hi-dev/externed_device_sample/can/can_api.py @@ -0,0 +1,23 @@ +import ctypes + +# 加载库 +lib = ctypes.CDLL('./libcan.so') + +# 设置函数的返回类型和参数类型 +lib.can_init.restype = ctypes.c_int +lib.tof_start.argtypes = [ctypes.c_int] +lib.tof_start.restype = ctypes.c_int +lib.tof_get.argtypes = [ctypes.c_int] +lib.tof_get.restype = ctypes.c_int + +# 使用C函数 +s = lib.can_init() +if s < 0: + print("Failed to initialize CAN") +else: + print("CAN initialized successfully") + # 调用tof_start和tof_get + if lib.tof_start(s) == 1: + print("tof_start successful") + if lib.tof_get(s) == 1: + print("tof_get successful") diff --git a/hi-dev/externed_device_sample/can/can_tof.c b/hi-dev/externed_device_sample/can/can_tof.c new file mode 100644 index 0000000000000000000000000000000000000000..c0091a50096fede57c20a6ec51b3f9b61b8706af --- /dev/null +++ b/hi-dev/externed_device_sample/can/can_tof.c @@ -0,0 +1,98 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int can_init() +{ + int s; + struct ifreq ifr; + struct sockaddr_can addr; + // 创建套接字 + if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { + perror("Error while opening socket"); + return -1; + } + // 设置CAN接口名称 + strcpy(ifr.ifr_name, "can0"); + ioctl(s, SIOCGIFINDEX, &ifr); + // 绑定套接字到CAN接口 + addr.can_family = AF_CAN; + addr.can_ifindex = ifr.ifr_ifindex; + if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + perror("Error in socket bind"); + return -2; + } + return s; +} + +int tof_start(int s) +{ + struct can_frame frame; + // 准备CAN帧 + frame.can_id = 0x402; // 11-bit identifier + frame.can_dlc = 8; // Data length code + frame.data[0] = 0xFF; + frame.data[1] = 0xFF; + frame.data[2] = 0xFF; + frame.data[3] = 0x01; + frame.data[4] = 0xFF; + frame.data[5] = 0xFF; + frame.data[6] = 0xFF; + frame.data[7] = 0xFF; + // 发送CAN帧 + if (write(s, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame)) { + printf("send can_frame fail\n"); + perror("Error in socket write"); + return -3; + } + return 1; +} + +int tof_get(int s) +{ + struct can_frame frame; + uint32_t data; + // read CAN帧 + + //fflush(s); + printf("read data start !\n"); + if (read(s, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame)) { + perror("Error in socket read"); + return -4; + } + + if((frame.can_id&0x1FFFFFFF) != 513) + { + return 0; + } + + data = (uint32_t)(frame.data[0] << 8 | frame.data[1] << 16 | frame.data[2] << 24)/ 256; + float result = data /1000.0f; + printf("juli is %f\n",result); + + return 1; +} +/* +void main() +{ + int s = -1; + s =can_init(); + while(1) + { + tof_start(s); + usleep(5*1000); + tof_get(s); + usleep(20*1000); + } + + +} +*/ diff --git a/hi-dev/externed_device_sample/can/can_tof.h b/hi-dev/externed_device_sample/can/can_tof.h new file mode 100644 index 0000000000000000000000000000000000000000..274d49e8a424f54e782b133f6a2f7916d23b9e5e --- /dev/null +++ b/hi-dev/externed_device_sample/can/can_tof.h @@ -0,0 +1,8 @@ +#ifndef _CAN_TOF_H +#define _CAN_TOF_H + +int can_init +int tof_start(int) +int tof_get(int) + +#endif diff --git a/hi-dev/externed_device_sample/i2c/Makefile b/hi-dev/externed_device_sample/i2c/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..f02c262bba1c30b04b46e47bc948a9171e9edbf6 --- /dev/null +++ b/hi-dev/externed_device_sample/i2c/Makefile @@ -0,0 +1,14 @@ +.SUFFIXES:.c .o +CC=gcc +SRCS=oled.c +OBJS=$(SRCS:.c=.o) +EXEC=liboled.so +all:$(OBJS) + $(CC) -shared -o $(EXEC) $(OBJS) +.c.o: + $(CC) -Wall -g -fPIC -o $(@) -c $< +clean: + rm -f $(OBJS) + rm -f core* + + diff --git a/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141238648.png b/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141238648.png new file mode 100644 index 0000000000000000000000000000000000000000..a68a667718a877213dc8ff50e81d9948394a49b7 Binary files /dev/null and b/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141238648.png differ diff --git a/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141258226.png b/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141258226.png new file mode 100644 index 0000000000000000000000000000000000000000..c241687396b9c7e5700d11132db2f90a554ae355 Binary files /dev/null and b/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141258226.png differ diff --git a/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141448094.png b/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141448094.png new file mode 100644 index 0000000000000000000000000000000000000000..19139e49d8e1bde1c5751f86931279dacfcfca04 Binary files /dev/null and b/hi-dev/externed_device_sample/i2c/README.assets/image-20240218141448094.png differ diff --git a/hi-dev/externed_device_sample/i2c/README.assets/image-20240219135411148.png b/hi-dev/externed_device_sample/i2c/README.assets/image-20240219135411148.png new file mode 100644 index 0000000000000000000000000000000000000000..aed17cfa0d24750b6957ca9b2f94e56f8cebf8a9 Binary files /dev/null and b/hi-dev/externed_device_sample/i2c/README.assets/image-20240219135411148.png differ diff --git a/hi-dev/externed_device_sample/i2c/README.assets/image-20240219143146815.png b/hi-dev/externed_device_sample/i2c/README.assets/image-20240219143146815.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0eec2de7182eea7742ce026eb3c51e26abc47f Binary files /dev/null and b/hi-dev/externed_device_sample/i2c/README.assets/image-20240219143146815.png differ diff --git a/hi-dev/externed_device_sample/i2c/README.md b/hi-dev/externed_device_sample/i2c/README.md new file mode 100644 index 0000000000000000000000000000000000000000..85378295f99fcf7f95546c899d4467a850debd8e --- /dev/null +++ b/hi-dev/externed_device_sample/i2c/README.md @@ -0,0 +1,48 @@ +# I2C + +## 一 例程简介 + +i2c例程为oled显示屏例程 + +## 二 测试环境说明 + +### 1)硬件准备 + +- 欧拉派 +- 拓展板 +- oled显示屏 + +### 2)软件环境 + +无 + +## 三 硬件连接 + +如图所示为oled显示屏连接欧拉派拓展板 + +![image-20240219143146815](./README.assets/image-20240219143146815.png) + +![image-20240218141258226](./README.assets/image-20240218141258226.png) + +## 四 例程运行说明 + +在开始测试前需检查oled驱动节点是否存在 + +```c +ls /dev/oled* +``` + +__oled显示屏显示ETH0网卡IP__ + +```c +ifconfig eth0 | grep -oP 'inet addr:\K\S+' | awk '{print $1}' >> "/dev/oled-0" +``` + +__oled显示屏显示易百纳鲸鱼logo__ + +```c +./oled "/dev/oled-0" 1 +``` + +![image-20240219135411148](./README.assets/image-20240219135411148.png) + diff --git a/hi-dev/externed_device_sample/i2c/i2c_oled.h b/hi-dev/externed_device_sample/i2c/i2c_oled.h new file mode 100644 index 0000000000000000000000000000000000000000..fee534ee6159e2e9500d0f0a8055a312013df91b --- /dev/null +++ b/hi-dev/externed_device_sample/i2c/i2c_oled.h @@ -0,0 +1,19 @@ +#ifndef __I2C_OLED_H__ +#define __I2C_OLED_H__ + +#include + +#define OLED_MAGIC 'G' + +struct oled_frame +{ + unsigned char data[128*8]; +}; + +#define OLED_CMD_FRAME _IOW(OLED_MAGIC,0,struct oled_frame) +#define OLED_CMD_CLEAR _IOW(OLED_MAGIC,1,unsigned char) +#define OLED_CMD_POWER _IOW(OLED_MAGIC,2,unsigned char) + + + +#endif // !__I2C_OLED_H__ diff --git a/hi-dev/externed_device_sample/i2c/oled.c b/hi-dev/externed_device_sample/i2c/oled.c new file mode 100644 index 0000000000000000000000000000000000000000..0d0af1623afe8f089ea46523009ff1f10905360f --- /dev/null +++ b/hi-dev/externed_device_sample/i2c/oled.c @@ -0,0 +1,111 @@ +#include "i2c_oled.h" +#include +#include +#include +#include +#include +#include + +const unsigned char gImage_ebaina[] = { +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F, +0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F, +0X7F,0X7F,0X7F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X1F,0X07,0X03,0X03,0X01, +0X01,0X00,0X80,0X80,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0, +0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0, +0XC0,0XC0,0XC0,0XC0,0X80,0X80,0X00,0X01,0X01,0X03,0X07,0X0F,0X1F,0X7F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X03,0X00,0X00,0X00,0X00,0X00,0X00, +0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0X81,0X81,0X81,0X81,0X81,0X81,0X81, +0X81,0X81,0XC3,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0X07,0X07, +0X03,0X03,0X07,0X07,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF3,0XE0,0XC0,0XC0,0XC0,0XC0,0X00,0X00,0X00,0X00,0X00, +0X00,0XC0,0XC0,0XC0,0XE0,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0XE0,0X80,0X00,0X00,0X00,0X00, +0X01,0X07,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X0E,0X0E, +0X0C,0X04,0X06,0X06,0X0F,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X3F,0X3F,0X1F,0X1F,0X1F,0X10,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X1F, +0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X0F,0X00,0X00,0X00,0X00,0X00, +0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0X7C,0X78, +0X78,0X70,0X70,0X70,0X70,0XF0,0XF0,0XF0,0XF0,0X70,0X70,0X70,0X70,0X70,0X78,0X78, +0X78,0XF8,0XFC,0XFC,0XFE,0XFF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0XFF,0XFF,0XFF, +0XFF,0XFF,0X78,0X70,0X70,0X70,0X70,0X70,0X70,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0, +0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0X00,0X00,0X00,0X00,0X00, +0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC7,0X83,0X81,0X80,0X80,0X80,0XC0, +0XE0,0XC0,0XC0,0X80,0X80,0X00,0X01,0X01,0X00,0X80,0X80,0XC0,0XC0,0XE0,0XC0,0X80, +0X80,0X00,0X01,0X01,0X00,0X00,0X80,0XC0,0XC0,0XE0,0XC0,0X80,0X80,0X00,0X00,0X01, +0X01,0X00,0X80,0X80,0XC0,0XE0,0XC0,0XC0,0X80,0X00,0X00,0X01,0X01,0X01,0X01,0X01, +0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X00,0X00,0X80,0XC0,0XE0, +0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +}; + + + +enum ARGS{ + ARGS_SELF, + ARGS_DEV, + ARGS_TYPE, + ARGS_DATA +}; +/* +int main(int argc,char*args[]) +{ + uint8_t data; + int type; + + sscanf(args[ARGS_TYPE],"%d",&type); + + int fd = open(args[ARGS_DEV],O_WRONLY); + if(fd<0) + return -1; + + if(type==0){ + sscanf(args[ARGS_DATA],"0x%x",&data); + if(ioctl(fd,OLED_CMD_CLEAR,&data) == -1){ + perror("ioctl failed"); + } + } + else if(type==1){ + if(ioctl(fd,OLED_CMD_FRAME,gImage_ebaina) == -1){ + perror("image:ioctl failed"); + } + } + + close(fd); + return 0; +} +*/ diff --git a/hi-dev/externed_device_sample/i2c/oled.py b/hi-dev/externed_device_sample/i2c/oled.py new file mode 100644 index 0000000000000000000000000000000000000000..df68dd17ded85309a0a142d20a59436b9d189521 --- /dev/null +++ b/hi-dev/externed_device_sample/i2c/oled.py @@ -0,0 +1,70 @@ +import ctypes + +# 加载libc库 +libc = ctypes.CDLL('libc.so.6') + +# 加载共享库 +liboled = ctypes.CDLL('./liboled.so') + +# 定义ioctl函数的参数和返回类型 +libc.ioctl.argtypes = [ctypes.c_int, ctypes.c_ulong, ctypes.c_void_p] +libc.ioctl.restype = ctypes.c_int + +# 定义open函数的参数和返回类型 +liboled.open.argtypes = [ctypes.c_char_p, ctypes.c_int] +liboled.open.restype = ctypes.c_int + +# 定义close函数的参数和返回类型 +liboled.close.argtypes = [ctypes.c_int] +liboled.close.restype = ctypes.c_int + +# 定义sscanf函数的参数和返回类型 +liboled.sscanf.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_void_p] +liboled.sscanf.restype = ctypes.c_int + +# 定义OLED_CMD_CLEAR和OLED_CMD_FRAME常量 +OLED_CMD_CLEAR = 0x100 +OLED_CMD_FRAME = 0x101 + +def oled_clear(device, data): + # 打开设备 + fd = liboled.open(device.encode('utf-8'), 1) + if fd < 0: + raise Exception("Failed to open device") + + # 将data转换为C类型 + c_data = ctypes.c_uint8(data) + + # 调用ioctl函数 + result = libc.ioctl(fd, OLED_CMD_CLEAR, ctypes.byref(c_data)) + if result == -1: + liboled.close(fd) + raise Exception("ioctl failed") + + # 关闭设备 + liboled.close(fd) + +def oled_display_image(device): + # 打开设备 + fd = liboled.open(device.encode('utf-8'), 1) + if fd < 0: + raise Exception("Failed to open device") + + # 调用ioctl函数 + result = libc.ioctl(fd, OLED_CMD_FRAME, gImage_ebaina) + if result == -1: + liboled.close(fd) + raise Exception("ioctl failed") + + # 关闭设备 + liboled.close(fd) + +if __name__ == "__main__": + device = "/dev/oled" # 假设设备路径为/dev/oled + data = 0x00 # 假设要清除的数据为0x00 + + try: + oled_clear(device, data) + oled_display_image(device) + except Exception as e: + print(f"Error: {e}")z diff --git a/hi-dev/externed_device_sample/pwm/Makefile b/hi-dev/externed_device_sample/pwm/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..1942eeafe25e300d48ddf0755f58458d47155c98 --- /dev/null +++ b/hi-dev/externed_device_sample/pwm/Makefile @@ -0,0 +1,14 @@ +.SUFFIXES:.c .o +CC=gcc +SRCS=pwm.c +OBJS=$(SRCS:.c=.o) +EXEC=libpwm.so +all:$(OBJS) + $(CC) -shared -o $(EXEC) $(OBJS) +.c.o: + $(CC) -Wall -g -fPIC -o $(@) -c $< +clean: + rm -f $(OBJS) + rm -f core* + + diff --git a/hi-dev/externed_device_sample/pwm/README.assets/image-20240202143734396.png b/hi-dev/externed_device_sample/pwm/README.assets/image-20240202143734396.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5d3db5b57ef62e6c32b5d2421eae22fd913a04 Binary files /dev/null and b/hi-dev/externed_device_sample/pwm/README.assets/image-20240202143734396.png differ diff --git a/hi-dev/externed_device_sample/pwm/README.assets/image-20240202143911653.png b/hi-dev/externed_device_sample/pwm/README.assets/image-20240202143911653.png new file mode 100644 index 0000000000000000000000000000000000000000..9994fad5d3d0d1c301a773d8b65b90b36cf7ac80 Binary files /dev/null and b/hi-dev/externed_device_sample/pwm/README.assets/image-20240202143911653.png differ diff --git a/hi-dev/externed_device_sample/pwm/README.assets/image-20240219133157350.png b/hi-dev/externed_device_sample/pwm/README.assets/image-20240219133157350.png new file mode 100644 index 0000000000000000000000000000000000000000..0a15a89be4aa48d9644594aab6407c273970a120 Binary files /dev/null and b/hi-dev/externed_device_sample/pwm/README.assets/image-20240219133157350.png differ diff --git a/hi-dev/externed_device_sample/pwm/README.md b/hi-dev/externed_device_sample/pwm/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d52943b9d448e708af5e602c2f75de5cfbf1fc62 --- /dev/null +++ b/hi-dev/externed_device_sample/pwm/README.md @@ -0,0 +1,65 @@ +# PWM + +## 一、例程简介 + +PWM例程可控制PWM引脚占空比,并可自由开启关闭PWM引脚输出 + +## 二、测试环境说明 + +### 1)硬件准备 + +- 欧拉派 +- 拓展板 +- 舵机 + +### 2)软件环境 + +无 + +## 三、硬件连接 + +如图所示为欧拉派与拓展板连接方式 + +![image-20240202143911653](./README.assets/image-20240202143911653.png) + +下图为舵机与拓展板连接图 + +![image-20240219133157350](./README.assets/image-20240219133157350.png) + +## 四、例程运行说明 + +进入欧拉派的终端,执行pwm程序 + +```c +PWM_help: +./pwm <1> <2> <3> <4> +<1> be open or close to enable/disable PWM +<2> be 1 or 15 to chose PWM0_1 or PWM0_15 +<3> be value for period +<3> be value for duty_cycle +``` + +#### 1)示例一 开启舵机 + +将舵机与拓展板连接,并执行如下指令 + +```c +./pwm open 1 20000000 2500000 +``` + +舵机开始转动 + +#### 2)示例二 关闭舵机 + +```c +./pwm close 1 +``` + +舵机停止转动 + +​ + + + + + diff --git a/hi-dev/externed_device_sample/pwm/pwm.c b/hi-dev/externed_device_sample/pwm/pwm.c new file mode 100644 index 0000000000000000000000000000000000000000..ebb1446e358ce854791e2ff290a0d268fc04f623 --- /dev/null +++ b/hi-dev/externed_device_sample/pwm/pwm.c @@ -0,0 +1,181 @@ +#include +#include +#include +#include +#include +#include +#include "pwm.h" + +void export_pwm(int num) { + int export_fd = open(PWM_EXPORT_PATH, O_WRONLY); + if (export_fd == -1) { + perror("Error opening export"); + exit(EXIT_FAILURE); + } + + // if (write(export_fd, "1", 2) == -1) { + // perror("Error exporting PWM"); + // close(export_fd); + // exit(EXIT_FAILURE); + // } + + dprintf (export_fd, "%d", num); + + close(export_fd); +} + +void unexport_pwm(int num) { + int unexport_fd = open(PWM_UNEXPORT_PATH, O_WRONLY); + if (unexport_fd == -1) { + perror("Error opening unexport"); + exit(EXIT_FAILURE); + } + + // if (write(unexport_fd, "1", 2) == -1) { + // perror("Error unexporting PWM"); + // close(unexport_fd); + // exit(EXIT_FAILURE); + // } + disable_pwm(num); + dprintf (unexport_fd, "%d", num); + + close(unexport_fd); +} + +void set_pwm_period(int num, int period) { + int period_fd; + switch (num) { + case 1: + period_fd = open(PWM1_PERIOD_PATH, O_WRONLY); + break; + case 15: + period_fd = open(PWM15_PERIOD_PATH, O_WRONLY); + break; + default: + period_fd = open(PWM1_PERIOD_PATH, O_WRONLY); + } + + + if (period_fd == -1) { + perror("Error opening period"); + exit(EXIT_FAILURE); + } + + dprintf(period_fd, "%d", period); + + close(period_fd); +} + +void set_pwm_duty_cycle(int num, int duty_cycle) { + int duty_cycle_fd; + switch (num) { + case 1: + duty_cycle_fd = open(PWM1_DUTY_CYCLE_PATH, O_WRONLY); + break; + case 15: + duty_cycle_fd = open(PWM15_DUTY_CYCLE_PATH, O_WRONLY); + break; + default: + duty_cycle_fd = open(PWM1_DUTY_CYCLE_PATH, O_WRONLY); + } + + if (duty_cycle_fd == -1) { + perror("Error opening duty cycle"); + exit(EXIT_FAILURE); + } + + dprintf(duty_cycle_fd, "%d", duty_cycle); + + close(duty_cycle_fd); +} + +void enable_pwm(int num) { + int enable_fd; + switch (num) { + case 1: + enable_fd = open(PWM1_ENABLE_PATH, O_WRONLY); + break; + case 15: + enable_fd = open(PWM15_ENABLE_PATH, O_WRONLY); + break; + default: + enable_fd = open(PWM1_ENABLE_PATH, O_WRONLY); + } + + if (enable_fd == -1) { + perror("Error opening enable"); + exit(EXIT_FAILURE); + } + + if (write(enable_fd, "1", 2) == -1) { + perror("Error enabling PWM"); + close(enable_fd); + exit(EXIT_FAILURE); + } + + close(enable_fd); +} + +void disable_pwm(int num) { + int enable_fd; + switch (num) { + case 1: + enable_fd = open(PWM1_ENABLE_PATH, O_WRONLY); + break; + case 15: + enable_fd = open(PWM15_ENABLE_PATH, O_WRONLY); + break; + default: + enable_fd = open(PWM1_ENABLE_PATH, O_WRONLY); + } + + if (enable_fd == -1) { + perror("Error opening enable"); + exit(EXIT_FAILURE); + } + + if (write(enable_fd, "0", 2) == -1) { + perror("Error disabling PWM"); + close(enable_fd); + exit(EXIT_FAILURE); + } + + close(enable_fd); +} + +void help () { + printf ("==========Usage of Demo_pwm==========\n"); + printf ("./Demo_pwm to see this help\n"); + printf ("./Demo_pwm <1> <2> <3> <4>\n"); + printf ("<1> be open or close to enable/disable PWM\n"); + printf ("<2> be 1 or 15 to chose PWM0_1 or PWM0_15\n"); + printf ("<3> be value for period\n"); + printf ("<3> be value for duty_cycle\n"); + printf ("example:./Demo_pwm open 1 50000 25000\n"); + printf ("example:./Demo_pwm close 1\n"); +} +/* +int main(int argc, char** argv) { + + if ((argc == 3) && !strcmp(argv[1], "close")) { + int num = atoi (argv[2]); + unexport_pwm(num); + return 0; + } + else if ((argc == 5) && !strcmp(argv[1], "open")) { + int num = atoi (argv[2]); + int period = atoi (argv[3]); + int duty_cycle = atoi (argv[4]); + export_pwm(num); + set_pwm_period(num, period); + set_pwm_duty_cycle(num, duty_cycle); + enable_pwm(num); + } + else { + help (); + } + + + return 0; +} +*/ diff --git a/hi-dev/externed_device_sample/pwm/pwm.h b/hi-dev/externed_device_sample/pwm/pwm.h new file mode 100644 index 0000000000000000000000000000000000000000..85d00ae451cb18cad0f33e9b16459acc1115bbaf --- /dev/null +++ b/hi-dev/externed_device_sample/pwm/pwm.h @@ -0,0 +1,24 @@ +#ifndef _PWM_H +#define _PWM_H + +#define PWM_CHIP_PATH "/sys/class/pwm/pwmchip0/" +#define PWM_EXPORT_PATH PWM_CHIP_PATH "export" +#define PWM_UNEXPORT_PATH PWM_CHIP_PATH "unexport" + +#define PWM1_PERIOD_PATH PWM_CHIP_PATH "pwm1/period" +#define PWM1_DUTY_CYCLE_PATH PWM_CHIP_PATH "pwm1/duty_cycle" +#define PWM1_ENABLE_PATH PWM_CHIP_PATH "pwm1/enable" + +#define PWM15_PERIOD_PATH PWM_CHIP_PATH "pwm15/period" +#define PWM15_DUTY_CYCLE_PATH PWM_CHIP_PATH "pwm15/duty_cycle" +#define PWM15_ENABLE_PATH PWM_CHIP_PATH "pwm15/enable" + +void enable_pwm(int); +void disable_pwm(int); +void set_pwm_duty_cycle(int, int); +void set_pwm_period(int, int); +void unexport_pwm(int); +void export_pwm(int); +void help(); + +#endif diff --git a/hi-dev/externed_device_sample/pwm/pwm_api.py b/hi-dev/externed_device_sample/pwm/pwm_api.py new file mode 100644 index 0000000000000000000000000000000000000000..f9c05a11e84500dd15eb2fae65820d030fa463a4 --- /dev/null +++ b/hi-dev/externed_device_sample/pwm/pwm_api.py @@ -0,0 +1,58 @@ +import ctypes + +# 加载动态链接库 +lib = ctypes.CDLL('./libpwm.so') + +# 定义函数参数和返回值类型 +lib.export_pwm.argtypes = [ctypes.c_int] +lib.export_pwm.restype = None + +lib.unexport_pwm.argtypes = [ctypes.c_int] +lib.unexport_pwm.restype = None + +lib.set_pwm_period.argtypes = [ctypes.c_int, ctypes.c_int] +lib.set_pwm_period.restype = None + +lib.set_pwm_duty_cycle.argtypes = [ctypes.c_int, ctypes.c_int] +lib.set_pwm_duty_cycle.restype = None + +lib.enable_pwm.argtypes = [ctypes.c_int] +lib.enable_pwm.restype = None + +lib.disable_pwm.argtypes = [ctypes.c_int] +lib.disable_pwm.restype = None + +lib.help.argtypes = [] +lib.help.restype = None + +# 封装成Python函数 +def export_pwm(num): + lib.export_pwm(num) + +def unexport_pwm(num): + lib.unexport_pwm(num) + +def set_pwm_period(num, period): + lib.set_pwm_period(num, period) + +def set_pwm_duty_cycle(num, duty_cycle): + lib.set_pwm_duty_cycle(num, duty_cycle) + +def enable_pwm(num): + lib.enable_pwm(num) + +def disable_pwm(num): + lib.disable_pwm(num) + +def help(): + lib.help() + +# 测试封装后的函数 +if __name__ == "__main__": + help() + export_pwm(1) + set_pwm_period(1, 50000) + set_pwm_duty_cycle(1, 25000) + enable_pwm(1) + disable_pwm(1) + unexport_pwm(1) diff --git a/hi-dev/externed_device_sample/uart/Makefile b/hi-dev/externed_device_sample/uart/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..63cec949f503f666bef2dbe820b05d8c0f36fed5 --- /dev/null +++ b/hi-dev/externed_device_sample/uart/Makefile @@ -0,0 +1,14 @@ +.SUFFIXES:.c .o +CC=gcc +SRCS=uart_senddata.c +OBJS=$(SRCS:.c=.o) +EXEC=libsenddata.so +all:$(OBJS) + $(CC) -shared -o $(EXEC) $(OBJS) +.c.o: + $(CC) -Wall -g -fPIC -o $(@) -c $< +clean: + rm -f $(OBJS) + rm -f core* + + diff --git a/hi-dev/externed_device_sample/uart/README.assets/image-20240130163038462.png b/hi-dev/externed_device_sample/uart/README.assets/image-20240130163038462.png new file mode 100644 index 0000000000000000000000000000000000000000..d441cc25368c034509100b66030df55e2f7bd044 Binary files /dev/null and b/hi-dev/externed_device_sample/uart/README.assets/image-20240130163038462.png differ diff --git a/hi-dev/externed_device_sample/uart/README.assets/image-20240130164201797.png b/hi-dev/externed_device_sample/uart/README.assets/image-20240130164201797.png new file mode 100644 index 0000000000000000000000000000000000000000..a20691a34ab0313e46ce644b96ac4f2b86ca5ce8 Binary files /dev/null and b/hi-dev/externed_device_sample/uart/README.assets/image-20240130164201797.png differ diff --git a/hi-dev/externed_device_sample/uart/README.md b/hi-dev/externed_device_sample/uart/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5bdc27775347a810ff84c0cb8d650ba9028106d9 --- /dev/null +++ b/hi-dev/externed_device_sample/uart/README.md @@ -0,0 +1,47 @@ +# UART + +## 一、例程简介 +uart例程主要基于EulerPi上面的uart4串口按照约定的格式进行发送数据 + +## 二、测试环境说明 + +### 1) 硬件准备 + +- 欧拉派 +- 串口调试小板 + +### 2) 软件环境 + +- MabaXterm +- SSCOM + +## 三、硬件连接 + +如图所示为uart4的硬件连接图,pin6脚为GND、pin8脚为TXD、pin10脚为RXD,对应连接串口小板的GND、RXD、TXD,即两端的TXD和RXD交叉连接。 + +image-20240130163038462 + + +## 四、例程运行说明 + +在开始测试前先将串口小板接到PC端,并在PC端打开串口调试工具。 +更改uart4复用关系: + +```shell +bspmm 0x0102F0134 0x1201 +bspmm 0x0102F0138 0x1201 +``` + +### 1) 发送测试 + +首先将uart_senddata可执行文件挂载到板端,使用`uart_senddata`命令进行发送测试,在欧拉派的终端执行,通过uart4发送`HiEuler` + +```shell +./uart_senddata /dev/ttyAMA4 9600 "HiEuler" +``` +运行成功后,即可在串口调试工具看到相关消息,如下图所示: + +image-20240130164201797 + + + diff --git a/hi-dev/externed_device_sample/uart/uart.h b/hi-dev/externed_device_sample/uart/uart.h new file mode 100644 index 0000000000000000000000000000000000000000..186b658eff6e891e490cbb3fea0465559b48aa6f --- /dev/null +++ b/hi-dev/externed_device_sample/uart/uart.h @@ -0,0 +1,6 @@ +#ifndef _UART_H +#define _UART_H + +void send_data(int, const char); + +#endif diff --git a/hi-dev/externed_device_sample/uart/uart_api.py b/hi-dev/externed_device_sample/uart/uart_api.py new file mode 100644 index 0000000000000000000000000000000000000000..d56aa6f1d01a8bbc255b48da5b3d787639920799 --- /dev/null +++ b/hi-dev/externed_device_sample/uart/uart_api.py @@ -0,0 +1,20 @@ +import ctypes + +# 加载共享库 +libsenddata = ctypes.CDLL('./libsenddata.so') + +# 定义send_data函数的参数和返回类型 +libsenddata.send_data.argtypes = [ctypes.c_int, ctypes.c_char_p] +libsenddata.send_data.restype = None + +def send_data_to_serial(fd, data): + # 将Python字符串转换为C字符串 + c_data = data.encode('utf-8') + # 调用C函数 + libsenddata.send_data(fd, c_data) + +if __name__ == "__main__": + # 示例:假设串口文件描述符为1,发送数据为"Hello, Serial!" + fd = 1 + data = "Hello, Serial!" + send_data_to_serial(fd, data) diff --git a/hi-dev/externed_device_sample/uart/uart_senddata.c b/hi-dev/externed_device_sample/uart/uart_senddata.c new file mode 100644 index 0000000000000000000000000000000000000000..96e9c65984183b5af5aa6159d2f90711027c9259 --- /dev/null +++ b/hi-dev/externed_device_sample/uart/uart_senddata.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include +#include "uart.h" + +void send_data(int fd, const char *data) { + int bytes_written = write(fd, data, strlen(data)); + if (bytes_written == -1) { + perror("Error occurred while writing data to the serial port"); + } else { + printf("Write %d bytes of data success : %s\n", bytes_written, data); + } +} +/* +int main(int argc, char *argv[]) { + if (argc != 4) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *serial_port = argv[1]; + int speed = atoi(argv[2]); + const char *data_to_send = argv[3]; + + int fd = open(serial_port, O_RDWR | O_NOCTTY); + if (fd == -1) { + perror("Open serial port fail\n"); + return 1; + } + + struct termios options; + if(tcgetattr(fd, &options) != 0) { + perror("Error from tcgetattr"); + close(fd); + return -1; + } + int baud_rate = B9600; + switch(speed) + { + case 9600: + baud_rate = B9600; + break; + case 115200: + baud_rate = B115200; + break; + default: + break; + } + + // Set baud rate + cfsetispeed(&options, baud_rate); + cfsetospeed(&options, baud_rate); + + // Set serial port parameters + options.c_cflag |= (CLOCAL | CREAD); + options.c_cflag &= ~PARENB; + options.c_cflag &= ~CSTOPB; + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS8; + + options.c_iflag &= ~(INPCK | ISTRIP); + options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); + options.c_oflag &= ~OPOST; + + tcflush(fd, TCIFLUSH); + // Apply settings + if (tcsetattr(fd, TCSANOW, &options) != 0) { + perror("Error from tcsetattr"); + close(fd); + return -1; + } + + send_data(fd, data_to_send); + + close(fd); + + return 0; +} +*/ diff --git "a/hi-dev/\351\241\271\347\233\256\347\273\223\351\241\271\346\212\245\345\221\212.md" "b/hi-dev/\351\241\271\347\233\256\347\273\223\351\241\271\346\212\245\345\221\212.md" new file mode 100644 index 0000000000000000000000000000000000000000..5cb4cb4b26039f5459a744cb261a54137b45f692 --- /dev/null +++ "b/hi-dev/\351\241\271\347\233\256\347\273\223\351\241\271\346\212\245\345\221\212.md" @@ -0,0 +1,54 @@ +# 项目结项报告 + +## 项目信息 + +- **项目名称**:海鸥派扩展驱动开发与Python API接口封装 +- **方案描述**:本项目旨在基于openEuler Embedded操作系统开发海鸥派硬件的扩展驱动,并为其提供Python API接口封装,以便于在Python环境中方便地进行硬件操作和数据交换。 +- 时间规划 + - **启动日期**:2024年6月30日 + - **结项日期**:2024年9月30日 + +## 项目总结 + +已完成工作: + +1. **环境搭建**: + - 成功在openEuler Embedded操作系统上搭建开发环境。 + - 配置了交叉编译工具链,确保可以在目标硬件上编译驱动程序。 +2. **驱动开发**: + - 完成了海鸥派硬件的基本驱动开发,包括GPIO、I2C、SPI等接口。 + - 实现了硬件的初始化、配置和数据交换功能。 +3. **Python API接口封装**: + - 使用Python的`ctypes`库封装了C语言编写的驱动接口。 + - 提供了一套简洁的Python API,使得在Python中操作硬件变得简单直观。 +4. **测试与验证**: + - 对开发的驱动和API进行了单元测试和集成测试。 + - 在多种场景下验证了驱动的稳定性和API的易用性。 +5. **文档编写**: + - 编写了详细的开发文档,包括设计说明、API使用指南和测试报告。 + - 准备了用户手册,指导用户如何安装和使用开发的驱动及API。 + +## 遇到的问题及解决方案: + +1. **兼容性问题**: + - **问题**:在某些硬件配置上,驱动程序出现了兼容性问题。 + - **解决方案**:通过修改驱动代码,增加了硬件检测和自动适配功能。 +2. **性能瓶颈**: + - **问题**:在高频率数据交换时,驱动程序出现了性能瓶颈。 + - **解决方案**:优化了数据处理流程,减少了不必要的内存拷贝和上下文切换。 +3. **Python封装难题**: + - **问题**:在将C语言驱动接口封装为Python API时,遇到了类型转换和内存管理的问题。 + - **解决方案**:利用`ctypes`库的特性,实现了精确的类型映射和自动的内存管理。 + +## 后续工作安排: + +1. **性能优化**: + - 进一步优化驱动程序,提高数据处理速度和系统响应时间。 +2. **功能扩展**: + - 根据用户反馈,增加更多硬件操作功能。 +3. **社区支持**: + - 在openEuler社区发布项目,收集用户反馈,提供技术支持。 +4. **维护更新**: + - 定期更新驱动程序和API,修复已知问题,适应新的硬件发展。 +5. **市场推广**: + - 准备市场推广材料,向潜在用户介绍本项目的优势和应用场景。 \ No newline at end of file