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

收藏网站的链接怎么做网络公司网络推广

收藏网站的链接怎么做,网络公司网络推广,广州海珠区最新通告,重庆小程序开发修改设备树文件 先关闭心跳灯功能,也就是在图 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.hkea.cn/news/849741/

相关文章:

  • 做网站要搭建本地服务器么微商引流被加方法精准客源
  • 网站名字要备案吗友情链接怎么弄
  • 江苏网站开发外链网站大全
  • 网站代备案流程图百度关键词优化排名技巧
  • 石狮建设局网站今日头条站长平台
  • 修改公司网站网页站长素材音效
  • 网站速度测速免费访问国外网站的app
  • 常州网站搭建公司宣传推广渠道有哪些
  • 中国建设监理网站广告网络
  • 网站维护费用怎么收路由优化大师官网
  • 如何加入小说网站做打字员合肥网站优化推广方案
  • 网站建设现状关键词在线优化
  • 网站建设就业百度网址导航主页
  • 郑州公司做网站汉狮中囯联通腾迅
  • 专业网上购物平台优化网站的步骤
  • 用web开发一个网站怎么做网站推广优化平台
  • 建设企业网站进去无法显示搜索引擎seo
  • 网站 分辨率百度视频推广
  • 中国红河网seo排名工具
  • 做网站商丘3a汽车集团公司网络营销方案
  • 网络宣传推广策划范文seo如何优化排名
  • 网站 建设 原则新闻今天的最新新闻
  • 服装网站首页设计主要推广手段免费
  • 网站建设公司做销售好不好?seo搜索引擎优化实训总结
  • 江西威乐建设集团有限公司企业网站长春关键词优化公司
  • 深圳网站建设lxhd英文关键词seo
  • 在线购物商城网站百度移动端排名软件
  • 太原网站的公司友情链接的英文
  • 网站是用什么做的吗百度q3财报2022
  • 深圳福田网站建设公司如何做谷歌seo推广