fmql之Linux中I2C总线框架

正点原子第44章        

I2C

 

zynq I2C

 

 

pcf8563芯片

我们用的是ds3231.

 

Linux I2C总线框架

 I2C总线驱动

这部分内容是半导体厂商编写的。

I2C总线设备

 

 

 zynq I2C适配器驱动

 

 

I2C设备驱动编写

 

使用设备树

 

代码编写

 设备树修改

 设备驱动编写

因为用的是ds3231,所以先找compatible的信息。

/***************************************************************
 Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.
 文件名    : ds3231.c
 作者      : Skylar
 版本      : V1.0
 描述      : IIC
 其他      : DS3231SN
 论坛      : www.openedv.com
 日志      : 初版V1.0 2024/10/10 创建
 ***************************************************************/

/************************	dts
/{ // 根节点
	......
};

&i2c0 {
	clock-frequency = <100000>;		// 100KHz
	rtc@68 {
		compatible = "maxim,ds3231";
		reg = <0x68>;
	};
};
 ************************/

#include <linux/module.h>
#include <linux/of_gpio.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/platform_device.h>
// #include <linux/input.h>
// #include <linux/timer.h>
// #include <linux/of_irq.h>
// #include <linux/interrupt.h>
// #include <linux/input-event-codes.h>
#include <linux/i2c.h>
#include <linux/bcd.h>

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/of_address.h>
#include <linux/of.h>
#include <linux/kern_levels.h>

#define DEVICE_NAME		"ds3231"

/*
 * ds3231 内部寄存器定义
 */
// #define DS3231_CTL_STATUS_1		0x00 /* 控制寄存器 1 */
// #define DS3231_CTL_STATUS_2		0x01 /* 控制寄存器 2 */
#define DS3231_VL_SECONDS		0x00 /* 时间: 秒 */
#define DS3231_MINUTES			0x01 /* 时间: 分 */
#define DS3231_HOURS			0x02 /* 时间: 小时 */
#define DS3231_DAYS				0x04 /* 日期: 天 */
#define DS3231_WEEKDAYS			0x03 /* 日期: 星期 */
#define DS3231_CENTURY_MONTHS	0x04 /* 日期: 月 */
#define DS3231_YEARS			0x06 /* 日期: 年 */

#define YEAR_BASE				2000 /* 20xx 年 */

/*
 * 自定义结构体,用于表示时间和日期信息
 */
struct ds3231_time {
	int sec; // 秒
	int min; // 分
	int hour; // 小时
	int day; // 日
	int wday; // 星期
	int mon; // 月份
	int year; // 年
};

/*
 * 自定义结构体 ds3231_dev
 * 用于描述 ds3231 设备
 */
struct ds3231_dev {
	struct i2c_client *client; /* i2c 次设备 */
	dev_t devid; /* 设备号 */
	struct cdev cdev; /* cdev 结构体 */
	struct class *class; /* 类 */
	struct device *device; /* 设备 */
};

static struct ds3231_dev ds3231;

/*
 * @description : 向 ds3231 设备多个连续的寄存器写入数据
 * @param – dev : ds3231 设备
 * @param – reg : 要写入的寄存器首地址
 * @param – buf : 待写入的数据缓存区地址
 * @param – len : 需要写入的字节长度
 * @return : 成功返回 0,失败返回一个负数
 */
static int ds3231_write_reg(struct ds3231_dev *dev, u8 reg, u8 *buf, u8 len)
{
	struct i2c_client *client = dev->client;
	struct i2c_msg msg;
	u8 send_buf[17] = {0};
	int ret;

	if (16 < len) {
		dev_err(&client->dev, "%s: error: Invalid transfer byte length %d\n",
				__func__, len);
		return -EINVAL;
	}

	send_buf[0] = reg; // 寄存器首地址
	memcpy(&send_buf[1], buf, len); // 将要写入的数据存放到数组 send_buf 后面

	msg.addr = client->addr; // ds3231 从机地址
	msg.flags = client->flags; // 标记为写数据
	msg.buf = send_buf; // 要写入的数据缓冲区
	msg.len = len + 1; // 要写入的数据长度

	ret = i2c_transfer(client->adapter, &msg, 1);
	if (1 != ret) {
		dev_err(&client->dev, "%s: error: reg=0x%x, len=0x%x\n",
				__func__, reg, len);
		return -EIO;
	}

	return 0;
}

/*
 * @description : 从 ds3231 设备中读取多个连续的寄存器数据
 * @param – dev : ds3231 设备
 * @param – reg : 要读取的寄存器首地址
 * @param – buf : 数据存放缓存区地址
 * @param – len : 读取的字节长度
 * @return : 成功返回 0,失败返回一个负数
 */
static int ds3231_read_reg(struct ds3231_dev *dev, u8 reg, u8 *buf, u8 len)
{
	struct i2c_client *client = dev->client;
	struct i2c_msg msg[2];
	int ret;

	/* msg[0]: 发送消息 */
	msg[0].addr = client->addr; // ds3231 从机地址
	msg[0].flags = client->flags; // 标记为写数据
	msg[0].buf = &reg; // 要写入的数据缓冲区
	msg[0].len = 1; // 要写入的数据长度

	/* msg[1]: 接收消息 */
	msg[1].addr = client->addr; // ds3231 从机地址
	msg[1].flags = client->flags | I2C_M_RD; // 标记为读数据
	msg[1].buf = buf; // 存放读数据的缓冲区
	msg[1].len = len; // 读取的字节长度

	ret = i2c_transfer(client->adapter, msg, 2);
	if (2 != ret) {
		dev_err(&client->dev, "%s: error: reg=0x%x, len=0x%x\n",
					__func__, reg, len);
		return -EIO;
	}

	return 0;
}

/*
 * @description : 打开设备
 * @param – inode : 传递给驱动的 inode
 * @param – filp : 设备文件,file 结构体有个叫做 private_data 的成员变量
 * 一般在 open 的时候将 private_data 指向设备结构体。
 * @return : 0 成功;其他 失败
 */
static int ds3231_open(struct inode *inode, struct file *filp)
{
	filp->private_data = &ds3231;
	return 0;
}

/*
 * @description : 从设备读取数据
 * @param – filp : 要打开的设备文件(文件描述符)
 * @param – buf : 返回给用户空间的数据缓冲区
 * @param – cnt : 要读取的数据长度
 * @param – off : 相对于文件首地址的偏移
 * @return : 读取的字节数,如果为负值,表示读取失败
 */
static ssize_t ds3231_read(struct file *filp, char __user *buf,
				size_t cnt, loff_t *off)
{
	struct ds3231_dev *dev = filp->private_data;
	struct i2c_client *client = dev->client;
	struct ds3231_time time = {0};
	u8 read_buf[9] = {0};
	int ret;

	/* 读寄存器数据 */
	// ret = ds3231_read_reg(dev, DS3231_CTL_STATUS_1,
	// 				read_buf, 9);
	// if (ret)
	// 	return ret;

	/* 校验时钟完整性 */
	if (read_buf[DS3231_VL_SECONDS] & 0x80) {
		dev_err(&client->dev,
					"low voltage detected, date/time is not reliable.\n");
		return -EINVAL;
	}
	/* 将 BCD 码转换为数据得到时间、日期 */
	time.sec = bcd2bin(read_buf[DS3231_VL_SECONDS] & 0x7F); // 秒
	time.min = bcd2bin(read_buf[DS3231_MINUTES] & 0x7F); // 分
	time.hour = bcd2bin(read_buf[DS3231_HOURS] & 0x3F); // 小时
	time.day = bcd2bin(read_buf[DS3231_DAYS] & 0x3F); // 日
	time.wday = read_buf[DS3231_WEEKDAYS] & 0x07; // 星期
	time.mon = bcd2bin(read_buf[DS3231_CENTURY_MONTHS] & 0x1F); // 月
	time.year = bcd2bin(read_buf[DS3231_YEARS]) + YEAR_BASE; // 年

	/* 将数据拷贝到用户空间 */
	return copy_to_user(buf, &time, sizeof(struct ds3231_time));
}

/*
 * @description : 向设备写数据
 * @param – filp : 设备文件,表示打开的文件描述符
 * @param – buf : 要写给设备写入的数据
 * @param – cnt : 要写入的数据长度
 * @param – offt : 相对于文件首地址的偏移
 * @return : 写入的字节数,如果为负值,表示写入失败
 */
static ssize_t ds3231_write(struct file *filp, const char __user *buf,
			size_t cnt, loff_t *offt)
{
	struct ds3231_dev *dev = filp->private_data;
	struct ds3231_time time = {0};
	u8 write_buf[9] = {0};
	int ret;
	ret = copy_from_user(&time, buf, cnt); // 得到应用层传递过来的数据
	if(0 > ret)
		return -EFAULT;

	/* 将数据转换为 BCD 码 */
	write_buf[DS3231_VL_SECONDS] = bin2bcd(time.sec); // 秒
	write_buf[DS3231_MINUTES] = bin2bcd(time.min); // 分
	write_buf[DS3231_HOURS] = bin2bcd(time.hour); // 小时
	write_buf[DS3231_DAYS] = bin2bcd(time.day); // 日
	write_buf[DS3231_WEEKDAYS] = time.wday & 0x07; // 星期
	write_buf[DS3231_CENTURY_MONTHS] = bin2bcd(time.mon); // 月
	write_buf[DS3231_YEARS] = bin2bcd(time.year % 100); // 年
	/* 将数据写入寄存器 */
	ret = ds3231_write_reg(dev, DS3231_VL_SECONDS,
					&write_buf[DS3231_VL_SECONDS], 7);
	if (ret)
		return ret;

	return cnt;
}

/*
 * @description : 关闭/释放设备
 * @param – filp : 要关闭的设备文件(文件描述符)
 * @return : 0 成功;其他 失败
 */
static int ds3231_release(struct inode *inode, struct file *filp)
{
	return 0;
}

/*
 * file_operations 结构体变量
 */
static const struct file_operations ds3231_ops = {
	.owner		= THIS_MODULE,
	.open		= ds3231_open,
	.read		= ds3231_read,
	.write		= ds3231_write,
	.release	= ds3231_release,
};

/*
 * @description : 初始化函数
 * @param – pdev : platform 设备指针
 * @return : 成功返回 0,失败返回负数
 */
static int ds3231_init(struct platform_device *pdev)
{
	u8 val;
	int ret;

	ret = ds3231_read_reg(dev, DS3231_VL_SECONDS, &val, 1); // 读 VL_SECONDS 寄存器
	if (ret)
		return ret;

	val &= 0x7F; // 将寄存器最高一位清零,也就是将 VL 位清零

	return ds3231_write_reg(dev, DS3231_VL_SECONDS, &val, 1); // 写入VL_SECONDS寄存器
}

/*
 * @description : platform 驱动的 probe 函数,当驱动与设备
 * 匹配成功以后此函数会被执行
 * @param – pdev : platform 设备指针
 * @return : 0,成功;其他负值,失败
 */
static int ds3231_probe(struct platform_device *pdev)
{
	int ret;

	dev_info(&pdev->dev, "I2C driver and device have been matched\n");

	/* 初始化 ds3231 */
	ds3231.client = client;
	ret = ds3231_init(&ds3231);
	if (ret)
		return ret;

	/* 申请设备号 */
	ret = alloc_chrdev_region(&ds3231.devid, 0, 1, DEVICE_NAME);
	if (ret)
		return ret;

	/* 初始化字符设备 cdev */
	ds3231.cdev.owner = THIS_MODULE;
	cdev_init(&ds3231.cdev, &ds3231_ops);

	/* 添加 cdev */
	ret = cdev_add(&ds3231.cdev, ds3231.devid, 1);
	if (ret)
		goto out1;

	/* 创建类 class */
	ds3231.class = class_create(THIS_MODULE, DEVICE_NAME);
	if (IS_ERR(ds3231.class)) {
		ret = PTR_ERR(ds3231.class);
		goto out2;
	}

	/* 创建设备 */
	ds3231.device = device_create(ds3231.class, &client->dev,
	ds3231.devid, NULL, DEVICE_NAME);
	if (IS_ERR(ds3231.device)) {
		ret = PTR_ERR(ds3231.device);
		goto out3;
	}

	i2c_set_clientdata(client, &ds3231);

	return 0;

out3:
	class_destroy(ds3231.class);

out2:
	cdev_del(&ds3231.cdev);

out1:
	unregister_chrdev_region(ds3231.devid, 1);

	return ret;
}

/*
 * @description : platform 驱动的 remove 函数,当 platform 驱动模块
 * 卸载时此函数会被执行
 * @param – dev : platform 设备指针
 * @return : 0,成功;其他负值,失败
 */
static int ds3231_remove(struct platform_device *pdev)
{
	struct ds3231_dev *ds3231 = i2c_get_clientdata(client);

	/* 注销设备 */
	device_destroy(ds3231->class, ds3231->devid);

	/* 注销类 */
	class_destroy(ds3231->class);

	/* 删除 cdev */
	cdev_del(&ds3231->cdev);

	/* 注销设备号 */
	unregister_chrdev_region(ds3231->devid, 1);

	return 0;
}

/* 匹配列表 */
static const struct of_device_id ds3231_of_match[] = {
	{.compatible = "maxim,ds3231"},
	{/* Sentinel */}
};

static struct platform_driver ds3231_driver = {
	.driver = {
		.name			= "ds3231",		/* platform_driver name*/
		.of_match_table	= ds3231_of_match,
	},
	.probe = ds3231_probe,
	.remove = ds3231_remove,
};


module_platform_driver(ds3231_driver);

MODULE_AUTHOR("Skylar <Skylar@33.com>");
MODULE_DESCRIPTION("I2C Driver, Input Subsystem");
MODULE_LICENSE("GPL");

/***************************************************************
 Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.
 文件名                 : ds3231APP.c
 作者                   : Skylar
 版本                   : V1.0
 描述                   : I2C   RTC
 其他                   : DS3231SN
 使用方法                : ./ds3231APP /dev/ds3231 read
						  ./ds3231APP /dev/ds3231 write
 论坛                   : www.openedv.com
 日志                   : 初版V1.0 2024/10/10 创建
 ***************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
// #include <sys/ioctl.h>
// #include <signal.h>	

struct ds3231_time {
	int sec; // 秒
	int min; // 分
	int hour; // 小时
	int day; // 日
	int wday; // 星期
	int mon; // 月份
	int year; // 年
};

/*
 * @description : main 主程序
 * @param – argc : argv 数组元素个数
 * @param – argv : 具体参数
 * @return : 0 成功;其他 失败
 */
int main(int argc, char *argv[]
{
	int fd, ret;
	struct ds3231_time time = {0};

	if(argc != 3){
		printf("Usage:\n"
			"\t./keyinputApp /dev/input/eventX  @ Open Key\n"
		);
	return -1;
	}

	/* 打开设备 */
	fd = open(argv[1], O_RDWR);
	if(fd < 0){
		printf("Erroe: file %s open failed\r\n", argv[1]);
		return -1;
	}

	if(!strcmp(argv[2], "read"))    // 读取时间
	{
		/* 读取RTC */
		ret = read(fd, &time, sizeof(struct ds3231_time));
		if(ret < 0){
			printf("Error: file %s read failed\r\n", argv[1]);
			goto out;
		}
		printf("%d-%d-%d %d:%d:%d ", time.year, time.mon, time.day,
				time.hour, time.min, time.sec);
		
		switch(time.wday){
			case 0:
				printf("Sunday\n");
				break;
			
			case 1:
				printf("Monday\n");
				break;
			
			case 2:
				printf("Tuesday\n");
				break;

			case 3:
				printf("Wednesday\n");
				break;

			case 4:
				printf("Thursday\n");
				break;

			case 5:
				printf("Friday\n");
				break;

			case 6:
				printf("Saturday\n");
				break;
		}
	} else {
		int data;
		printf("Year: ");
		scanf("%d", &data);
		time.year = data;

		printf("Month: ");
		scanf("%d", &data);
		time.mon = data;

		printf("Day: ");
		scanf("%d", &data);
		time.day = data;

		printf("Date: ");
		scanf("%d", &data);
		time.wday = data;

		printf("Hour: ");
		scanf("%d", &data);
		time.hour = data;

		printf("Minute: ");
		scanf("%d", &data);
		time.min = data;

		printf("Second: ");
		scanf("%d", &data);
		time.sec = data;

		write(fd, &time, sizeof(struct ds3231_time));
	}

out:
	close(fd);
	return 0;
})

 

运行测试

modprobe ds3231.ko

但是:

没有/dev/ds3231:

dts:(因为是模拟i2c)

i2c_gpio0: i2c-gpio-0 {
		#address-cells = <1>;
		#size-cells = <0>;

		compatible = "dallas,ds3232","i2c-gpio";
		// MIO56-SDA, MIO55-SCL
		gpios = <&portc 2 0
			 &portc 1 0 >;
		status = "okay";
		i2c-gpio,delay-us = <5>; // 100k Hz
			
		rtc@68 {
			compatible = "maxim,ds3231";
			reg = <0x68>;	//ID
			status = "okay";
		};
	};

对比教程的dts:

 原来是因为,_of_match同时有了i2c-gpio0和rtc的匹配的compatible:(ds3231.c)

/* 匹配列表 */
static const struct of_device_id ds3231_of_match[] = {
	{.compatible = "maxim,ds3231"},
	{.compatible = "dallas,ds3232"},
	{.compatible = "i2c-gpio"},
	{/* Sentinel */}
};

static struct i2c_driver ds3231_driver = {
	.driver = {
		.name			= "ds3231",		/* platform_driver name*/
		.of_match_table	= ds3231_of_match,
	},
	.probe = ds3231_probe,
	.remove = ds3231_remove,
};

修改成只匹配rtc@68的compatible属性。

RTC驱动框架

正点原子第45章

 

 

 

 AXI IIC

正点原子第46章

(目前不需要这部分,就先不看了)

需求

板子上的i2c是模拟i2c,所以需要i2c-gpio.c

而i2c的用途是与ds3231通信,也就是rtc的功能,所以也需要rec-ds3232.c

但是在这两个c文件中,前者实现了gpio电平翻转,后者实现了时间的收发。

Linux I2C子系统分析之(一) ----- 用GPIO模拟I2C总线_i2c-gpio.c-CSDN博客

所以,要在i2c-gpio.c的基础上,添加i2c的通信协议(自己写吧?)。

所以是要在APP.c中实现?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899541.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 PyTorch 构建 LSTM 股票价格预测模型

目录 引言准备工作1. 训练模型&#xff08;train.py&#xff09;2. 模型定义&#xff08;model.py&#xff09;3. 测试模型和可视化&#xff08;test.py&#xff09;使用说明模型调整结论 引言 在金融领域&#xff0c;股票价格预测是一个重要且具有挑战性的任务。随着深度学习…

1024软件推荐-rubick

开源的插件化桌面端效率工具箱。插件是基于 npm 进行安装和卸载&#xff0c;非常轻便。插件数据支持 webdav 多端同步&#xff0c;非常安全。支持内网部署&#xff0c;可二次定制化开发&#xff0c;非常灵活。 前言 rubick 之前的插件管理&#xff0c;依托于云服务器存储&…

滴水逆向三期笔记与作业——02C语言——13 指针(3)(4)

滴水逆向三期笔记与作业——02C语言——13 指针3、4 一、模拟实现CE的数据搜索功能 OneNote迁移 一、模拟实现CE的数据搜索功能 //其中有0xAA&#xff0c;超过有符号char范围&#xff0c;在vscode中会报错&#xff0c;所以使用unsigned char unsigned char data[100] {0x00,0…

一起搭WPF架构之完结总结篇

一起搭WPF架构之完结总结篇 前言设计总结设计介绍页面一页面二页面三 结束 前言 整体基于WPF架构&#xff0c;根据自己的需求简单设计与实现了衣橱的数据统计、增加与读取数据、并展示数据的小软件。我知道自己在设计方面还有很多不足&#xff0c;暂时先做到这里了&#xff0c…

gbase8s权限管理

一 权限分类 分片级权限&#xff08;分片表&#xff09; 表引用 类型级权限 例程级权限 语言级权限 序列级权限 等... 其中常用的为 数据库级权限&#xff0c;表级权限&#xff0c;序列级权限以及例程级权限 二 权限控制 当创建一个用户时&#xff0c;该用户没有任何权…

为了数清还有几天到周末,我用python绘制了日历

日历的秘密 昨天&#xff0c;在看小侄子写作业的时候&#xff0c;发现了一个秘密&#xff1a;他在“演算纸”&#xff08;计算数学题用的草纸&#xff09;上画了非常多的日历。对此我感到了非常的困惑&#xff0c;“这是做什么的&#xff1f;” 后来&#xff0c;经过了我不懈…

机器学习面试笔试知识点-线性回归、逻辑回归(Logistics Regression)和支持向量机(SVM)

机器学习面试笔试知识点-线性回归、逻辑回归Logistics Regression和支持向量机SVM 一、线性回归1.线性回归的假设函数2.线性回归的损失函数(Loss Function)两者区别3.简述岭回归与Lasso回归以及使用场景4.什么场景下用L1、L2正则化5.什么是ElasticNet回归6.ElasticNet回归的使…

【设计模式】MyBatis 与经典设计模式:从ORM到设计的智慧

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【设计模式】揭秘Spri…

计算机网络:数据链路层 —— 以太网(Ethernet)

文章目录 局域网局域网的主要特征 以太网以太网的发展100BASE-T 以太网物理层标准 吉比特以太网载波延伸物理层标准 10吉比特以太网汇聚层交换机物理层标准 40/100吉比特以太网传输媒体 局域网 局域网&#xff08;Local Area Network, LAN&#xff09;是一种计算机网络&#x…

GitLab-删除仓库分支(删除远程分支)

进入对应仓库选择对应的分支进行删除操作。

为什么学习使用数控加工中心吗?

现代制造业现代制造业对高精度、高效率的加工需求日益增长&#xff0c;数控加工中心作为核心设备&#xff0c;其操作和维护技能成为企业招聘的重要考量。企业需要能够熟练操作数控加工中心&#xff0c;并具备解决复杂加工问题的能力的人才。 学校通过系学习和实践&#xff0c;学…

不用编程,快速实现多台西门子PLC跟三菱PLC之间数据通讯

PLC通讯智能网关IGT-DSER模块支持汇川、西门子、三菱、欧姆龙、罗克韦尔AB、GE等各种品牌的PLC之间通讯&#xff0c;同时也支持PLC与Modbus协议的变频器、智能仪表等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。PLC内无需编程开发&#xff0c;在智能网关…

基于SSM健身国际俱乐部系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;场地类别管理&#xff0c;场地信息管理&#xff0c;运动项目管理&#xff0c;场地类型管理&#xff0c;项目类型管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心…

使用SearXNG-搭建个人搜索引擎(附国内可用Docker镜像源)

介绍 SearXNG是聚合了七十多种搜索服务的开源搜索工具。我们可以匿名浏览页面&#xff0c;不会被记录和追踪。作为开发者&#xff0c;SearXNG也提供了清晰的API接口以及完整的开发文档。 部署 我们可以很方便地使用Docker和Docker compose部署SearXNG。下面给出Docker部署Se…

ChartCheck: Explainable Fact-Checking over Real-World Chart Images

论文地址: https://aclanthology.org/2024.findings-acl.828.pdfhttps://aclanthology.org/2024.findings-acl.828.pdf 1.概述 事实验证技术在自然语言处理领域获得了广泛关注,尤其是在针对误导性陈述的检查方面。然而,利用图表等数据可视化来传播信息误导的情况却很少受到…

反弹shell的小汇总

前提 理解正向连接和反向连接 正向连接&#xff1a;客户端主动发起连接到服务器或目标系统客户端充当主动方&#xff0c;向服务器发起连接请求&#xff0c;然后服务器接受并处理请求。 反向连接&#xff1a;目标系统&#xff08;通常是受害者&#xff09;主动建立与控制系统…

手机拍证件照,换正装有领衣服及底色的方法

证件照在我们的职业生涯的关键节点是经常会用到的&#xff0c;比如毕业入职、人事档案建立、升迁履历、执业资格考试和领证等&#xff0c;这些重要的证件照往往要求使用正装照&#xff0c;有时候手头没有合适的衣服&#xff0c;或者原先的证件照背景色不符合要求&#xff0c;就…

如何在算家云搭建ControlNext-SVD(视频生成)

一、ControlNext-SVD-V2简介 ControlNext-SVD-V2 是 ControlNext-SVD 的 V2 模型。其中 ControlNext-SVD 模型是通过添加 ControlNet 来控制 Stable Video Diffusion (SVD)&#xff0c;使用高分辨率视频训练&#xff0c;具体来说它可以将图片生成与指定姿态相匹配的高质量视频…

Python异常检测- 单类支持向量机(One-Class SVM)

系列文章目录 Python异常检测- Isolation Forest&#xff08;孤立森林&#xff09; python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子&#xff08;LOF&#xff09;算法 Python异常检测- DBSCAN 文章目录 系列文章目录前言一、On…

1024程序员日|向改变世界的程序员 致敬!

“给我一行代码&#xff0c;我将点亮整个服务器” “给我一个键盘&#xff0c;我就能征服数字世界” 今天 10月24号 是广大程序员“法定”节日&#xff08;据说是自定的&#xff09; 因为1024是2的十次方 二进制计数的基本计量单位 1GB 1024MB&#xff0c;1MB 1024KB……