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

专门做特卖的网站是什么意思/推广费用一般多少钱

专门做特卖的网站是什么意思,推广费用一般多少钱,深圳网站制作公司机构,WordPress多用户建站1 驱动程序的编写 驱动是LINUX开发的必经之路&#xff0c;应用层对底层的调用经过了库与内核&#xff0c;内核以下才是驱动层&#xff0c;当你在应用程序运行对底层的控制时&#xff0c;驱动程序为你的控制提供了接口&#xff0c;或者说是策略。#include <linux/module.h>…

1 驱动程序的编写

驱动是LINUX开发的必经之路,应用层对底层的调用经过了库与内核,内核以下才是驱动层,当你在应用程序运行对底层的控制时,驱动程序为你的控制提供了接口,或者说是策略。



#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <asm/io.h>


#define DEVICE_NAME "PWM_MOUDLE"
#define PWM_MOUDLE_PHY_ADDR 0x6CA00000    //This Address is based XPS 这个地址ISE EDK中分配的地址就是硬件的东东啦
/* 描写叙述驱动程序的一些信息,不是必须的 */
MODULE_AUTHOR("Xilinx XUP");             // 驱动程序的作者
MODULE_DESCRIPTION("PWM moudle dirver"); // 一些描写叙述信息
MODULE_VERSION("v1.0");
MODULE_LICENSE("GPL");                   // 遵循的协议


static int pwm_driver_major;
static struct class* pwm_driver_class = NULL;
static struct device* pwm_driver_device = NULL;unsigned long pwm_fre_addr = 0;		//pwm moulde's frequency visual address
unsigned long pwm_duty_addr = 0;	//pwm moulde's duty visual address
static long frequency=0;
/*这个结构是字符设备驱动的核心*/
static struct file_operations pwm_driver_fops = {.owner = THIS_MODULE,               /* 这是一个宏,推向编译模块时自己主动创建的__this_module变量 在Export.h (c:\users\administrator\desktop\linux-3.3-digilent\include\linux):#define THIS_MODULE (&__this_module)*/
};
static ssize_t sys_pwm_frequency_set (struct device* dev, struct device_attribute* attr, const char* buf, size_t count)
{long value = 0;int i;frequency=0;outl(value,  pwm_fre_addr); //close pwm moudle before we modfiy the frequencyfor (i = 0; i < count-1; i++){frequency  *= 10;frequency += buf[i] - '0';}if(value>100000000) value=100000000;value=100000000/frequency;  // 100Mhz/frequency 100Mhz is set by XPSoutl(value,  pwm_fre_addr);return count;
} 

static ssize_t sys_pwm_duty_set (struct device* dev, struct device_attribute* attr, const char* buf, size_t count) //duty cycle 
{long value = 0;int i;
//outl(value,  pwm_duty_addr); //close pwm moudle before we modfiy the duty cyclefor (i = 0; i < count-1; i++){value  *= 10;value += buf[i] - '0';}if (value>100) value=100;value=100000000/frequency*value/100;if (value!= 0)value = value | 0x80000000;outl(value,  pwm_duty_addr);return count;
} 
static DEVICE_ATTR(pwm_frequency, S_IWUSR, NULL, sys_pwm_frequency_set);
static DEVICE_ATTR(pwm_duty, S_IWUSR, NULL, sys_pwm_duty_set);


/* 运行insmod xxx.ko时就会运行pwm_driver_module_init()函数 *


static int __init pwm_driver_module_init(void)
{int ret;/* 注冊字符设备驱动程序* 參数为主设备号、设备名字、file_operations结构;* 这样,主设备号就和详细的file_operations结构联系起来了,* 操作主设备为BUTTON_MAJOR的设备文件时,就会调用s3c24xx_buttons_fops中的相关成员函数* BUTTON_MAJOR能够设为0,表示由内核自己主动分配主设备号*/pwm_driver_major=register_chrdev(0, DEVICE_NAME, &pwm_driver_fops);//内核注冊设备驱动if (pwm_driver_major < 0){printk("failed to register device.\n");return -1;}pwm_driver_class = class_create(THIS_MODULE, "pwm_driver");        //创建PWM设备类if (IS_ERR(pwm_driver_class)){printk("failed to create pwm moudle class.\n");unregister_chrdev(pwm_driver_major, DEVICE_NAME);return -1;}
    pwm_driver_device = device_create(pwm_driver_class, NULL, MKDEV(pwm_driver_major, 0), NULL, "pwm_device"); //利用pwm_driver设备类创建一个pwm_deviceif (IS_ERR(pwm_driver_device)){printk("failed to create device .\n");unregister_chrdev(pwm_driver_major, DEVICE_NAME);return -1;}ret = device_create_file(pwm_driver_device, &dev_attr_pwm_frequency);       //在pwm_device设备中创建frequency与duty两个文件if (ret < 0)printk("failed to create pwm_frequency endpoint\n");ret = device_create_file(pwm_driver_device, &dev_attr_pwm_duty);if (ret < 0)                                                                //将pwm模块的物理地址映射到虚拟地址上 也就是EDK中分配的地址printk("failed to create pwm_duty endpoint\n");pwm_fre_addr = (unsigned long)ioremap(PWM_MOUDLE_PHY_ADDR, sizeof(u32));//To get Custom IP--PWM moudle's virtual addresspwm_duty_addr = pwm_fre_addr+4;		printk(" pwm driver initial successfully!\n");return 0;
}


/*
运行rmmod xxx.ko时就会运行pwm_driver_module_exit()函数
*/
static void __exit pwm_driver_module_exit(void)
{device_remove_file(pwm_driver_device, &dev_attr_pwm_frequency);device_remove_file(pwm_driver_device, &dev_attr_pwm_duty);device_destroy(pwm_driver_class, MKDEV(pwm_driver_major, 0));class_unregister(pwm_driver_class);class_destroy(pwm_driver_class);unregister_chrdev(pwm_driver_major, DEVICE_NAME);printk("pwm module exit.\n");
}
/* 这两行指定驱动程序的初始化函数和卸载函数 */
module_init(pwm_driver_module_init);
module_exit(pwm_driver_module_exit);
 

2驱动程序的编译

 makefile编写

  ifneq ($(KERNELRELEASE),)obj-m := pwm_driver.oelseKERNEL_DIR := <YOUR_DIR>/ZedBoard/Kernel/Digilent-linux-3.3PWD := $(shell pwd)all:$(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules ARCH=armclean:rm *.o *.ko *.mod.cendif

<YOUR_DIR>/ZedBoard/Kernel/Digilent-linux-3.3 是你的路径
最后make 生成pwm_driver.ko 复制到zedboard文件系统上

3 驱动程序的測试

   载入驱动

   insmod pwm_driver.ko在/dev/ 下能够找到我们注冊的设备 pwm_device

  进入/sys/class/..文件夹  

  在zedboard 的shell上运行 echo 1000 > pwm_frequency  

                             echo 50    > pwm_duty

http://www.lbrq.cn/news/1583569.html

相关文章:

  • 岗顶网站建设/电商运营培训班
  • 怎么给网站做懒加载/账号seo是什么
  • 百事企业的网站建设类型/西安竞价托管公司
  • 网站建设的几个要素/济南seo优化公司助力网站腾飞
  • 企业网站建设制作公司/嘉兴新站seo外包
  • 哪些网站可以接点私活做的/seo推广一年要多少钱
  • 做景观园林的网站是/批量查询权重
  • 网站提交了被收录后改怎么做/免费建站
  • linux系统怎么做网站/aso优化师主要是干嘛的
  • 做博客网站要怎么配置的服/广告宣传费用一般多少
  • 珠海科技网站建设/公司营销策划方案案例
  • 怎么做网站的搜索栏/专业做app软件开发公司
  • 如何自建企业网站/成都seo工程师
  • 哪些网站可以做代理/个人怎么在百度上做推广
  • 网站比较分析/最佳搜索引擎磁力王
  • 网站开发制作公/景德镇seo
  • 建设公司网站的意义/湖北网站seo设计
  • 做私活的网站/免费外链网站
  • 南沙哪有做网站的/品牌营销策划包括哪些内容
  • 今日国内新闻头条15条简短/时空seo助手
  • mvc做的网站怎么连接数据库/我为什么不建议年轻人做销售
  • 下载的网站模板怎么使用/互联网营销专业
  • 网站建设管理系统/廊坊推广seo霸屏
  • 网站建设的学校/网站推广在线推广
  • 外贸仿牌网站建设/优化疫情防控 这些措施你应该知道
  • 常见的静态网站开发技术/页优化软件
  • 网站建设的工资/综合搜索引擎
  • 独立ip访问网站/河南seo外包
  • dw做asp购物网站/b2b平台是什么意思
  • 广州网站建设中心/友情链接交换统计表
  • 文件管理从基础到高级:文件描述符、超大文件切片重组与快速删除实战
  • 接口返回504 Gateway Time-out 错误,这意味着请求在网关或代理服务器等待上游服务器响应时超时。以下是可能的原因和排查建议:
  • provide 和 inject 最佳实践
  • 用 “私房钱” 类比闭包:为啥它能访问外部变量?
  • Web 端 AI 图像生成技术的应用与创新:虚拟背景与创意图像合成
  • 基于 Jenkins Pipeline 实现 DITA 文档自动化构建与发布(开源方案)