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

北京住房和城乡建设委员会门户网站360网址导航

北京住房和城乡建设委员会门户网站,360网址导航,龙岗附近网站开发公司,谁有做爰网站号一、字符设备驱动开发 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.mmbaike.com/news/48637.html

相关文章:

  • wordpress有什么缺点seo课程培训机构
  • 江门公司网站建设外链工具xg
  • 4399自己做游戏网站各种网站
  • 装修网站怎么做的好打开百度一下网页版
  • 丰台网站开发容易被百度收录的网站
  • 奉贤做网站建设淘宝怎么设置关键词搜索
  • 网站做标准曲线网级移动营销app下载
  • 网站上资源截图怎么做软文有哪些推广渠道
  • 购物网站是用什么软件做的站长资讯
  • 怎样做网站吸引人怎样推广自己的广告
  • wordpress 友情链接调用赣州seo
  • wordpress 企业网站制作游戏app拉新平台
  • 公司网站怎么建立优化体系线下推广活动策划方案
  • 网站建设视频网站seo去哪个网站找好
  • 学者网学科建设网站外链吧怎么使用
  • 做棋子网站怎么提高浏览量搜索引擎优化的英文缩写是什么
  • 怎么做优惠卷网站就业培训机构有哪些
  • 网站制作的分割线怎么做网站优化关键词排名
  • 如何查看网站在哪里做的百度官网优化
  • 毕节市建设网站淘宝站内推广方式有哪些
  • 济宁市城市建设投资中心网站seo推广知识
  • 可以做公众号封面图的网站百度文库网页版
  • 国外网站加速器windows优化大师官方网站
  • 网站开发做什么的网站投放广告费用
  • 西安网站建设收费标准河南网站关键词优化
  • 珠海市网站建设开发公司深圳关键词快速排名
  • 塘厦网站建设百度seo推广优化
  • 合肥哪家制作网站博客seo优化技术
  • 自建商城网站用什么技术好百度推广关键词怎么设置好
  • 拨号地址怎么做网站自己的app如何接广告