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

用户体验度好的网站做网站人员有什么名称

用户体验度好的网站,做网站人员有什么名称,车机油哪个网站做的好,wordpress 启用gzip压缩目录 驱动模块的加载和卸载 驱动程序Makefile编写 字符设备注册与注销 字符设备驱动模板 应用程序对驱动读写操作 iounmap函数 LED寄存器物理地址映射到虚拟地址 应用程序代码编写 Linux驱动的两种运行方式#xff1a; 1、将驱动编译进Linux内核中#xff0c;也就是zIm…目录 驱动模块的加载和卸载 驱动程序Makefile编写 字符设备注册与注销 字符设备驱动模板 应用程序对驱动读写操作 iounmap函数 LED寄存器物理地址映射到虚拟地址 应用程序代码编写 Linux驱动的两种运行方式 1、将驱动编译进Linux内核中也就是zImage当内核启动的说话就会自动运行驱动程序 2、将驱动编译成模块Linux下模块扩展名为.ko在Linux内核启动以后要用insmod命令加载驱动模块用rmmod命令卸载驱动模块 驱动模块的加载和卸载 模块的加载和卸载的注册函数如下 module_init(xxx_init); //注册模块加载函数 module_exit(xxx_exit); //注册模块卸载函数 编译驱动的时候需要用到linux内核源码因此要解压缩linux内核源码然后再编译得到zImage和.dtb。需要使用编译后的zImage和dtb启动系统。 驱动程序Makefile编写 KERNELDIR : /home/zzs/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_gaCURRENT_PATH : $(shell pwd)obj-m : chrdevbase.obuild: kernel_moduleskernel_modules:$(MAKE) -C $(KERNELDIR) M$(CURRENT_PATH) modulesclean:$(MAKE) -C $(KERNELDIR) M$(CURRENT_PATH) clean 驱动编译完成以后扩展名为.ko两种命令可以加载驱动模块insmod和modprobe 在启动Linux内核后输入如下命令加载驱动 insmod drv.ko modprobe命令相比于insmod命令区别在于modprobe可以解决依赖关系的问题insmod命令如果要驱动依赖于first.ko模块的模块就有一个先加载后加载的问题而modprobe就比较智能一些会对模块进行依赖关系的分析然后就所有的依赖模块都加载到内核中。 我们将编译生成的.ko模块拷贝到rootfs中通过nfs传输到开发板中进行使用。 使用modprobe命令出现下面的错误 原因是没有加载modules.dep通过depmod命令进行加载如果无法使用depmod要通过busybox重新配置。 显示当前存在的模块命令如下 lsmod 驱动模块的卸载使用rmmod命令即可因为另一种卸载驱动模块的命令modprobe -r的使用前提是所卸载模块的依赖模块已经没有被其他模块使用否则就不能使用该命令卸载驱动模块 rmmod drv.ko 使用printk打印日志信息验证模块的加载和卸载 字符设备注册与注销 字符设备的注册函数 static inline register chrdev(unsigned int major,const char *name,const struct file_operations *fops) 字符设备的注销函数 static inline void unregister_chrdev(unsigned int major,const char *name) major主设备号Linux下每个设备都有一个设备号设备号分为主设备号和次设备号两部分 name设备名字 fops结构体file_operations类型指针指向设备的操作函数集合变量 设备号由主设备号和次设备号组成主设备号表示一个具体的驱动次设备号表示使用这个驱动的各个设备。 设备号的类型为dev_t是一个定义为u32的数据类型也就是unsigned int其中高12位是主设备号低20位是次设备号所有主设备号的范围是0~4095选择主设备号时不要超出这个范围。 查看当前系统所有已经使用了的设备号 cat /proc/devices 一般字符设备的注册在驱动模块的入口函数xxx_init中进行字符设备的注销在驱动模块的出口函数xxx_exit中进行。 字符设备驱动模板 /*打开设备*/ 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,loft_t *offt) {/*用户实现具体功能*/return 0; }/*向设备写数据*/ static ssize_t chrtest_write(struct file *filp,const char __user *buf,size_t cnt,loft_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(retvalue0){/*字符设备注册失败自行处理*/}return 0; }/*驱动出口函数*/ static void __exit xxx_exit(void) {/*注销字符设备驱动*/unregister_chrdev(200,chrtest); }/*将上面两个函数指定为驱动的入口和出口函数*/ module_init(xxx_init); module_exit(xxx_exit);/*添加LICENSE和作者信息*/ MODULE_LICENSE(GPL); MODULE_AUTHOR(ZHANGZHONGSHENG); 应用程序对驱动读写操作 驱动给应用传递数据的时候用到copy_to_user函数该函数用来完成内核空间的数据到用户空间的复制函数原型如下 static inline long copy_to_user(void *to,const void *from,unsigned long n); 参数to表示目的参数from表示源参数n表示要复制的数据长度如果复制成功返回值为0如果复制失败返回负数。 因为用户空间的内存不能直接访问内核空间内存所以使用copy_from_user函数来实现函数原型如下 static inline long copy_from_user(void *to,const void *from,unsigned long n); 字符串转换为整型数据 首先添加stdlib库然后使用atoi函数。 MMU 全称是Memory Manage Unit内存管理单元其主要功能如下 1、完成虚拟空间到物理空间的映射 2、内存保护设置存储器的访问权限设置虚拟存储空间的缓冲特性 裸机的时候可以直接对0x01010101这个物理地址进行操作但是linux不行因为linux会使能mmu 在Linux里面操作的都是虚拟地址所以需要得到0x01010101这个物理地址的虚拟地址。 ioremap函数 如果我们没有使能MMU可以直接向寄存器地址读写数据但是我们现在启动Linux内核后会自动使能MMU此时我们需要将这个寄存器的物理地址转换为虚拟地址涉及到两个函数如下 ioremap函数用于获取指定物理地址空间对应的虚拟地址空间定义在arch/arm/include/asm/io.h中本质是一个宏 第一个参数是物理地址起始大小第二个参数是要转换的字节数量例如0x01010101开始的10个地址进行转换 va ioremap(0x01010101,10) 返回值是转换的起始地 iounmap函数 卸载驱动时使用iounmap函数释放掉ioremap函数所做的映射 iounmap(va); 寄存器物理地址 #define CCM_CCGR1_BASE (0X020C406C) #define SW_MUX_GPIO1_IO03_BASE (0X020E0068) #define SW_PAD_GPIO1_IO03_BASE (0X020E02F4) #define GPIO1_DR_BASE (0X0209C000) #define GPIO1_GDIR_BASE (0X0209C004) LED寄存器物理地址映射到虚拟地址 1地址映射后的虚拟地址指针 static void __iomem *IMX6U_CCM_CCGR1; static void __iomem *SW_MUX_GPIO1_IO03; static void __iomem *GPIO1_DR; static void __iomem *GPIO1_GDIR; 2物理地址映射成虚拟地址供Linux使用在驱动入口函数中 IMX6U_CCM_CCGR1 ioremap(CCM_CCGR1_BASE,4); SW_MUX_GPIO1_IO03 ioremap(SW_MUX_GPIO1_IO03_BASE,4); SW_PAD_GPIO1_IO03 ioremap(SW_PAD_GPIO1_IO03_BASE,4); GPIO1_DR ioremap(GPIO1_DR_BASE,4); GPIO1_GDIR ioremap(GPIO1_GDIR_BASE,4); 3取消地址映射在驱动出口函数中 iounmap(IMX6U_CCM_CCGR1); iounmap(SW_MUX_GPIO1_IO03); iounmap(SW_PAD_GPIO1_IO03); iounmap(GPIO1_DR); iounmap(GPIO1_GDIR); 4对虚拟地址进行初始化配置 val readl(IMX6U_CCM_CCGR1); val ~(3 26); /*先清除以前的配置bit26,27*/ val | 3 26; /*bit26,27置1*/ writel(val,IMX6U_CCM_CCGR1);writel(0x5,SW_MUX_GPIO1_IO03); //设置复用 writel(0X10B0,SW_PAD_GPIO1_IO03); //设置电气属性val readl(GPIO1_GDIR); val | 1 3; //bit3置1,设置为输出 writel(val,GPIO1_GDIR); val readl(GPIO1_DR); val ~(1 3); //bit3清零打开LED writel(val,GPIO1_DR); 应用程序代码编写 #include sys/types.h #include sys/stat.h #include fcntl.h #include stdio.h #include unistd.h #include stdlib.h #include string.h /**argc:应用程序参数个数*argv:具体的参数内容字符串形式*./ledAPP filename 0:1 0表示关灯 1表示开灯*./ledAPP /dev/led 0 关灯*./ledAPP /dev/led 1 开灯 */#define LEDOFF 0 #define LEDON 1int main(int argc,char *argv[]) {int fd,retvalue; //fd是文件描述符char *filename; //filename是设备名称unsigned char databuf[1];if(argc ! 3){printf(Error Usage!\r\n);return -1;}filename argv[1];fd open(filename,O_RDWR); //O_RDWR是用读写模式if(fd 0){printf(file %s open failed!\r\n,filename);return -1;}databuf[0] atoi(argv[2]); //将字符数据转换为数字retvalue write(fd,databuf,sizeof(databuf)); //对设备进行写操作if(retvalue 0){printf(LED control Failed!\r\n);close(fd);return -1;}close(fd);return 0; } 创建设备结点命令 mknod /dev/led c 200 0 /dev/led是设备名称是传递给应用程序的第二个参数c表示字符设备200是主设备号0表示次设备号
http://www.w-s-a.com/news/720653/

相关文章:

  • 公司网站百度搜不到如何自己做一个网站
  • 学生如何建设网站网站开发程序
  • 网站建设公司哪家好 皆来磐石网络网站建设"淘宝网" 在颜色选取和搭配方面有哪些值得学习的地方.
  • 网站如何做移动规则适配北京住房与城乡建设部网站
  • 课堂阵地建设网站wordpress运行机制
  • 网站建设的需求方案企业网站建设费用明细
  • 创口贴网站模板京创影视app
  • 团购网站建设目的网站有很多304状态码
  • 运用阿里云怎么做网站外资企业可以在中国境内做网站吗
  • 云南住房和城乡建设局网站西安做官网的公司
  • 企业网站图片上传网站建设和应用的情况
  • 网站不显示内容吗聊城网架公司
  • 南昌网站建设企业网站托管外包怎么做
  • 做非洲外贸的网站网站可以用PS设计吗
  • PHP搭建IDC网站青岛福瀛建设集团网站
  • 安徽网站优化多少钱软件界面设计的基本原则
  • 网站建设动态页面修改删除dnf卖飞机的网站怎么做的
  • 万网是做什么的seo综合
  • 网站关键词分隔符php网站开发平台下载
  • 郑州那家做网站便宜商业计划书免费word版
  • 秦时明月的个人网站怎么做网站开发公司需要招聘哪些人
  • 广告网站建设制作设计服务商安卓app软件定制
  • 公司网站设计与实现中国职业培训在线官方网站
  • 网站服务器空间租用郑州官网网站推广优化
  • 郑州网站建设外包业务wordpress站酷首页
  • 机关门户网站 建设 方案个人怎么申请注册商标
  • 梧州网站建设有哪些九江网站建设优化
  • APP网站建设开发企业发展英文seo招聘
  • 临海市住房和城乡建设规划局网站高校图书馆网站的建设方案
  • 建立门户网站张店易宝网站建设