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

网站js代码检测电脑培训

网站js代码检测,电脑培训,时时彩 斗牛 等网站开发,wordpress上传代码修改设备树文件 先关闭心跳灯功能,也就是在图 10.4.1.2 中第 167 行添加 status 改为 disabled,也就是禁止 work 这个节点,那么禁止心跳灯功能。 我们后面需要禁止哪个功能,只需要将其 status 属性改为 disabled 就可以了。 gpi…

修改设备树文件

先关闭心跳灯功能,也就是在图 10.4.1.2 中第 167 行添加 status 改为 disabled,也就是禁止 work 这个节点,那么禁止心跳灯功能。

我们后面需要禁止哪个功能,只需要将其 status 属性改为 disabled 就可以了。

	gpioled{compatible = "zxk, led";led-gpio = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;status = "okay";};

编译内核并烧写boot.img

// 1. 编译
./bulid.sh kernel
// 2. 烧写

驱动编写

/* 设置LED所使用的GPIO *//* 1. 获取设备节点:gpioled */gpioled.nd = of_find_node_by_path("/gpioled");if (gpioled.nd == NULL){printk("gpioled node not found!\n");return -EINVAL;}/* 2. 读取status属性 */ret = of_property_read_string(gpioled.nd, "status", &str);if (ret < 0){printk("gpioled status not found!\n");return -EINVAL;}if (strcmp(str, "okay") != 0){printk("gpioled status not okay!\n");return -EINVAL;}/* 3. 获取compatible属性值并进行匹配 */ret = of_property_read_string(gpioled.nd, "compatible", &str);if (ret < 0){printk("compatible property not found!\n");return -EINVAL;}if (strcmp(str, "zxk, led")!= 0){printk("compatible property not match!\n");return -EINVAL;}/* 4. 获取gpio属性值并转换为gpio */ gpioled.led_gpio =  of_get_named_gpio(gpioled.nd, "led-gpio", 0);if (gpioled.led_gpio < 0){printk("led-gpio property not found!\n");return -EINVAL;}printk("led-gpio = %d\n", gpioled.led_gpio);/* 5. 向gpio子系统申请使用GPIO */ret = gpio_request(gpioled.led_gpio, "led-gpio");if (ret < 0){printk("gpio_request failed!\n");return -EINVAL;}/* 6. 设置GPIO为输出模式,并输出为低电平,默认led关闭 */ret = gpio_direction_output(gpioled.led_gpio, 0);if (ret < 0){printk("gpio_direction_output failed!\n");return -EINVAL;}
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
//#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>/**************************************************************** 文件名   : gpioled.c* 功能     : 这是一个led设备驱动程序文件* 作者     : zxk* 创建日期: 2024年11月28日* 其他     
***************************************************************/#define GPIOLED_CNT     1               /* 设备号个数 */
#define GPIOLED_NAME    "gpioled"       /* 设备名 */
#define LED_ON          1       /* 开灯 */
#define LED_OFF         0       /* 关灯 *//* gpioled 设备结构体 */
struct gpioled_dev
{dev_t devid;                /* 设备号 */struct cdev cdev;               /* cdev */struct class *class;        /* 类 */struct device *device;      /* 设备 */int major;                  /* 主设备号 */int minor;                  /* 次设备号 */struct device_node *nd;     /* 设备节点 */int led_gpio;               /* led对应的gpio */
};struct gpioled_dev gpioled;/**************************************************************** led_open - 函数名* description  : 打开设备* @param-inode : 传递给驱动的 inode* @param-filp  : 设备文件,file 结构体有个叫做 private_data 的成员变量* 一般在 open 的时候将 private_data 指向设备结构体。** 返回值       : 0 成功
***************************************************************/
static int led_open(struct inode *inode, struct file *filp)
{filp->private_data = &gpioled; /* 设置私有数据 */return 0;
}/**************************************************************** led_reads - 函数名* @description   : 从设备读取数据* @param-filp   : 要打开的文件设备* @param-buf    : 返回给用户空间的数据缓冲区* @param-cnt    : 读取的数据长度* @param-off_t  : 相对于文件首地址的偏移* @return       :读取的字节数
***************************************************************/
static ssize_t led_read(struct file *filp, char __user *buf, size_t cnt, loff_t *off_t)
{    return 0;
}/**************************************************************** led_write - 函数名* @description   : 向设备写入数据* @param-filp   : 设备文件,要打开的文件设备* @param-buf    : 要写入设备的数据* @param-cnt    : 写入的数据长度* @param-off_t  : 相对于文件首地址的偏移* @return       :写入的文件数 
***************************************************************/
static ssize_t led_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *off_t)
{int retvalue;unsigned char databuf[1];unsigned char ledstat;struct gpioled_dev *dev = filp->private_data;retvalue = copy_from_user(databuf, buf, cnt);if(retvalue < 0) {printk("kernel write failed!\r\n");return -EFAULT;}ledstat = databuf[0];       /* 获取状态值 */if(ledstat == LED_ON) { gpio_set_value(dev->led_gpio, 1);       /* 打开LED灯 */} else if(ledstat == LED_OFF) {gpio_set_value(dev->led_gpio, 0);       /* 关闭LED灯 */}return 0;
}/**************************************************************** led_release - 函数名* description  : 关闭释放设备* @param-inode : 传递给驱动的 inode* @param-filp  : 设备文件,要关闭的文件设备描述符** 返回值       : 0 成功
***************************************************************/
static int led_release(struct inode *inode, struct file *filp)
{return 0;
}/*
* 设备操作函数结构体
* 将驱动函数映射为系统调用
*/static struct file_operations gpioled_fops = 
{.owner = THIS_MODULE,.open = led_open,.read = led_read,.write = led_write,.release = led_release,
};/**************************************************************** led_init - 函数名* description  : 驱动入口函数* @param       : 无* 返回值        : 0 成功
***************************************************************/
static int __init led_init(void)
{int ret;const char *str;/* 设置LED所使用的GPIO *//* 1. 获取设备节点:gpioled */gpioled.nd = of_find_node_by_path("/gpioled");if (gpioled.nd == NULL){printk("gpioled node not found!\n");return -EINVAL;}/* 2. 读取status属性 */ret = of_property_read_string(gpioled.nd, "status", &str);if (ret < 0){printk("gpioled status not found!\n");return -EINVAL;}if (strcmp(str, "okay") != 0){printk("gpioled status not okay!\n");return -EINVAL;}/* 3. 获取compatible属性值并进行匹配 */ret = of_property_read_string(gpioled.nd, "compatible", &str);if (ret < 0){printk("compatible property not found!\n");return -EINVAL;}if (strcmp(str, "zxk, led")!= 0){printk("compatible property not match!\n");return -EINVAL;}/* 4. 获取gpio属性值并转换为gpio */ gpioled.led_gpio =  of_get_named_gpio(gpioled.nd, "led-gpio", 0);if (gpioled.led_gpio < 0){printk("led-gpio property not found!\n");return -EINVAL;}printk("led-gpio = %d\n", gpioled.led_gpio);/* 5. 向gpio子系统申请使用GPIO */ret = gpio_request(gpioled.led_gpio, "led-gpio");if (ret < 0){printk("gpio_request failed!\n");return -EINVAL;}/* 6. 设置GPIO为输出模式,并输出为低电平,默认led关闭 */ret = gpio_direction_output(gpioled.led_gpio, 0);if (ret < 0){printk("gpio_direction_output failed!\n");return -EINVAL;}/* 注册字符设备驱动 *//* 1.创建设备号 */if (gpioled.major){gpioled.devid = MKDEV(gpioled.major, 0);ret = register_chrdev_region(gpioled.devid, GPIOLED_CNT, GPIOLED_NAME);if (ret < 0){printk("cannot register %s char driver [ret=%d]\n",GPIOLED_NAME, GPIOLED_CNT);goto free_gpio;}}else{ret = alloc_chrdev_region(&gpioled.devid, 0, GPIOLED_CNT, GPIOLED_NAME);if (ret < 0){printk("cannot register %s char driver [ret=%d]\n",GPIOLED_NAME, GPIOLED_CNT);goto free_gpio;}gpioled.major = MAJOR(gpioled.devid);/* 获取主设备号 */gpioled.minor = MINOR(gpioled.devid);/* 获取次设备号 */}printk("gpioled major=%d,minor=%d\r\n",gpioled.major,gpioled.minor);/*  2.初始化cdev */gpioled.cdev.owner = THIS_MODULE;cdev_init(&gpioled.cdev, &gpioled_fops);/* 3.添加一个cdev字符设备 */ret = cdev_add(&gpioled.cdev, gpioled.devid, GPIOLED_CNT);if (ret < 0){goto del_unregister;}/* 4. 创建类 */gpioled.class = class_create(THIS_MODULE, GPIOLED_NAME);if (IS_ERR(gpioled.class)){goto del_cdev;}/* 5.创建设备 */gpioled.device = device_create(gpioled.class, NULL, gpioled.devid, NULL, GPIOLED_NAME);if (IS_ERR(gpioled.device)){goto destroy_class;}printk("led_init() \r\n");return 0;destroy_class:class_destroy(gpioled.class);
del_cdev:cdev_del(&gpioled.cdev);
del_unregister:unregister_chrdev_region(gpioled.devid, GPIOLED_CNT);
free_gpio:gpio_free(gpioled.led_gpio);return -EIO;
}/**************************************************************** led_exit - 函数名* description  : 驱动出口函数* @param       : 无* 返回值        : 0 成功
***************************************************************/
static void __exit led_exit(void)
{/* 注销字符设备驱动 */cdev_del(&gpioled.cdev);    /* 删除 cdev */unregister_chrdev_region(gpioled.devid, GPIOLED_CNT);/* 删除类 */device_destroy(gpioled.class, gpioled.devid);class_destroy(gpioled.class);/* 释放GPIO */gpio_free(gpioled.led_gpio);printk("led_exit() \r\n");
}/* 将上面两个函数指定为驱动的入口和出口函数 */
module_init(led_init);
module_exit(led_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("zxk");
MODULE_INFO(intree, "Y");
ARCH = arm64
KERNELDIR := /home/zxk/work/rk3568_linux_sdk/kernel
CURRENT_PATH := /home/zxk/linux_driver/05_gpioled/obj-m := gpioled.obulid: kernel_moduleskernel_modules:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) cleana

编译测试

// 1.编译
make ARCH=arm64 //ARCH=arm64 必须指定,否则编译会失败
/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc ledApp.c -o ledApp
// 2.上传
scp ./01_chrdevbase/chrdevbase.ko root@192.168.137.65:/lib/modules/4.19.232/
scp ./01_chrdevbase/chrdevbaseAPP root@192.168.137.65:/lib/modules/4.19.232/
http://www.15wanjia.com/news/4017.html

相关文章:

  • 做网站国外网站店铺引流的30种方法
  • 哈尔滨建站的系统网站建设杭州
  • 哪些网站做的比较好看的深圳网站开发技术
  • 广告策划公司简介seo网站推广培训
  • 太湖县住房和城乡建设网站市建设局属于免费的网络营销方式
  • 做网站的编程语言产品seo怎么优化
  • 模板网站怎么做百度商家版下载
  • 如何提高网站的搜索排名磁力狗bt
  • 东莞信息网seo关键词有话要多少钱
  • 网站开发工程师月薪seo顾问
  • web到wordpress宁波seo优化
  • 南京电子商务网站开发公司发外链的网址
  • 网络公司网站建设营销方法
  • 建设网站公司不给源代码人工智能培训师
  • 网站制作建立公司品牌推广方案范文
  • 衡阳县专业做淘宝网站域名申请
  • 石家庄做网站的sem投放
  • 做网站在阿里云买什么软件百度指数官网首页
  • 爬墙专用加速器seo优化包括
  • b2b网站建设排名百度官方客服电话
  • 做暧暧的网站18款禁用软件黄app免费
  • 中国室内设计网站官网培训方案模板
  • 建网站流程 知乎怎么做网络广告推广
  • 电子商务网站的开发流程包括推广关键词排名方法
  • 响应式网站如何设计邯郸今日头条最新消息
  • 津南区提供网站建设协议网站流量分析的指标有哪些
  • 网站优化案例分析哪些平台可以免费发布产品
  • 做音乐网站要注意什么外贸网站推广
  • 在合肥做网站前端月薪大概多少百度网盘人工客服电话
  • 做优惠券网站山东东营网络seo