当前位置: 首页 > news >正文

萝岗免费网站建设抖音推广渠道有哪些

萝岗免费网站建设,抖音推广渠道有哪些,甘肃做网站价格,网站建设与维护理解一、字符设备驱动开发 1.1 字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI,LCD 等等都…

一、字符设备驱动开发

1.1 字符设备驱动简介

字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。

1.2 驱动模块加载和卸载
1、字符设备驱动模块加载和卸载函数模板

	/* 驱动入口函数 */
static int __init xxx_init(void)
{/* 入口函数具体内容 */return 0;
}/* 驱动出口函数 */
static void __exit xxx_exit(void)
{/* 出口函数具体内容 */
}/* 将上面两个函数指定为驱动的入口和出口函数 */
module_init(xxx_init);
module_exit(xxx_exit);

驱动编译完成以后扩展名为.ko,有两种命令可以加载驱动模块:insmod和 modprobe,推荐使用modprobe,此命令用于加载指定的.ko 模块,比如加载 drv.ko 这个驱动模块,命令如下:

modprobe drv.ko

驱动模块的卸载使用命令“rmmod”即可,比如要卸载 drv.ko,使用如下命令即可:

rmmod drv.ko

1.3 驱动模块注册与注销

字符设备的注册和注销函数原型如下所示:

static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
static inline void unregister_chrdev(unsigned int major, const char *name)
/*
register_chrdev 函数用于注册字符设备,此函数一共有三个参数,这三个参数的含义如下:
major:主设备号,Linux 下每个设备都有一个设备号,设备号分为主设备号和次设备号两
部分,关于设备号后面会详细讲解。
name:设备名字,指向一串字符串。
fops:结构体 file_operations 类型指针,指向设备的操作函数集合变量。
unregister_chrdev 函数用户注销字符设备,此函数有两个参数,这两个参数含义如下:
major:要注销的设备对应的主设备号。
name:要注销的设备对应的设备名。 
*/

一般字符设备的注册在驱动模块的入口函数 xxx_init 中进行,字符设备的注销在驱动模块的出口函数 xxx_exit 中进行。内容如下所示:

static struct file_operations test_fops;/* 驱动入口函数 */
static int __init xxx_init(void)
{/* 入口函数具体内容 */int retvalue = 0;/* 注册字符设备驱动 */retvalue = register_chrdev(200, "chrtest", &test_fops);if(retvalue < 0){/* 字符设备注册失败,自行处理 */}return 0;
}/* 驱动出口函数 */
static void __exit xxx_exit(void)
{/* 注销字符设备驱动 */unregister_chrdev(200, "chrtest");
}/* 将上面两个函数指定为驱动的入口和出口函数 */
module_init(xxx_init);
module_exit(xxx_exit);

1.4 实现设备具体操作函数
file_operations 结构体就是设备的具体操作函数

/* 打开设备 */
static int chrtest_open(struct inode *inode, struct file *filp)
{/* 用户实现具体功能 */return 0;
}/* 从设备读取 */
static ssize_t chrtest_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{/* 用户实现具体功能 */return 0;
}/* 向设备写数据 */
static ssize_t chrtest_write(struct file *filp,
const char __user *buf,size_t cnt, loff_t *offt)
{/* 用户实现具体功能 */return 0;
}/* 关闭/释放设备 */
static int chrtest_release(struct inode *inode, struct file *filp)
{/* 用户实现具体功能 */return 0;
}static struct file_operations test_fops = {.owner = THIS_MODULE, .open = chrtest_open,.read = chrtest_read,.write = chrtest_write,.release = chrtest_release,
};/* 驱动入口函数 */
static int __init xxx_init(void)
{/* 入口函数具体内容 */int retvalue = 0;/* 注册字符设备驱动 */retvalue = register_chrdev(200, "chrtest", &test_fops);if(retvalue < 0){/* 字符设备注册失败,自行处理 */}return 0;
}/* 驱动出口函数 */
static void __exit xxx_exit(void)
{/* 注销字符设备驱动 */unregister_chrdev(200, "chrtest");
}/* 将上面两个函数指定为驱动的入口和出口函数 */
module_init(xxx_init);
module_exit(xxx_exit);

1.5 添加LICENSE信息

MODULE_LICENSE() //添加模块 LICENSE 信息
MODULE_AUTHOR() //添加模块作者信息

加入 LICENSE 和作者信息,完成以后的内容如下:

/* 打开设备 */
static int chrtest_open(struct inode *inode, struct file *filp)
{
/* 用户实现具体功能 */
return 0;
}
....../* 将上面两个函数指定为驱动的入口和出口函数 */
module_init(xxx_init);
module_exit(xxx_exit);MODULE_LICENSE("GPL");  //采用GPL协议
MODULE_AUTHOR("hsd");	//添加作者名字

1.6 设备号的分配

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
/*
函数 alloc_chrdev_region 用于申请设备号,此函数有 4 个参数:
dev:保存申请到的设备号。
baseminor:次设备号起始地址,alloc_chrdev_region 可以申请一段连续的多个设备号,这
些设备号的主设备号一样,但是次设备号不同,次设备号以 baseminor 为起始地址地址开始递
增。一般 baseminor 为 0,也就是说次设备号从 0 开始。
count:要申请的设备号数量。
name:设备名字。
注销字符设备之后要释放掉设备号,设备号释放函数如下:*/
void unregister_chrdev_region(dev_t from, unsigned count)
/*
此函数有两个参数:
from:要释放的设备号。
count:表示从 from 开始,要释放的设备号数量。
*/

1.7 物理内存与虚拟内存转换函数

1、ioremap 函数

#define ioremap(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE)/*
cookie:要映射给的物理起始地址。
size:要映射的内存空间大小。
*/

2、iounmap 函数

void iounmap (volatile void __iomem *addr)

1.8 IO内存访问函数
1、读操作函数

u8 readb(const volatile void __iomem *addr)
u16 readw(const volatile void __iomem *addr)
u32 readl(const volatile void __iomem *addr)

2、写操作函数

void writeb(u8 value, volatile void __iomem *addr)
void writew(u16 value, volatile void __iomem *addr)
void writel(u32 value, volatile void __iomem *addr)

遇见问题
1、uboot下载系统失败,以前都能成功,突然不能下载怎么解决?
首先,保证正个网段内开发板的IP地址和ubuntu的IP地址是唯一的,测试哪个IP地址有冲突,比如ubuntu的192.168.1.66有被其他设备占用,如果有占用就改一个没被占用的IP地址。

http://www.ds6.com.cn/news/79735.html

相关文章:

  • 网站建设图片改不了东莞优化网站关键词优化
  • 商务网站建设简答题及答案收录查询 站长工具
  • 网站建设月总结灰色词快速上排名
  • b2b网站优化怎么做室内设计培训班学费一般多少
  • 2014做社交网站爱站长
  • 网站banner文字最大多少市场调研的重要性
  • 金融类网站开发百度超级链
  • 佛山牛豹云网站开发2022年免费云服务器
  • 建立个人博客网站百度seo排名优
  • 手机网站导航菜单可以放友情链接的网站
  • h5响应式网站建设报价个人博客
  • 二级域名绑定网站今天上海重大新闻事件
  • 行业网站 cms手机网站模板
  • 高端外贸网站建设网站推广软文范例
  • 室内设计软件下载网站大全郑州疫情最新情况
  • 中央经济工作会议2020google 优化推广
  • seo搜索引擎优化内容主要有西安网站建设方案优化
  • 杭州旅游网站开发说明书seo优化主要做什么
  • wordpress主题仪表盘安徽网络关键词优化
  • wordpress 按钮链接开鲁seo服务
  • 网络品牌网站建设手机网站建设价格
  • 门户网站解决方案微帮推广平台怎么加入
  • 图片做旧网站怎样做企业宣传推广
  • 高端建筑物图片常州seo招聘
  • 深圳网站网络建设关键词分词工具
  • 看网站用什么软件厦门seo哪家强
  • logo在线设计制作海南seo
  • wordpress末班知乎seo排名的搜软件
  • 顺德网站设计制作seo相关岗位
  • 做fitting的网站宣传推广方式