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

公司网站导航栏是什么手机百度下载免费

公司网站导航栏是什么,手机百度下载免费,企业网站 开源php,seo排名哪家正规修改设备树文件 先关闭心跳灯功能,也就是在图 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.yayakq.cn/news/557564/

相关文章:

  • 网站建设与维护试题a卷湛江网站建设公司哪个好
  • icp备案官网查询南阳seo
  • 网页个人主页模板长沙官网seo诊断
  • 企业集团网站建设方案公司商标设计图
  • 网站建设推荐网大连网站建设要多少钱
  • 网站开发实训报告总结中国移动互联网
  • 炫酷网站欣赏2016泰安网站建设策划方案
  • 织梦网站管理安装网站建设发布实训总结
  • 衡水企业网站建设费用开源软件
  • 山西网站建设推荐咨询做公司网站的推广工作怎样
  • 设计网站的关键点五道口网站建设公司
  • 东莞 科技 公司 网站建设用rp怎么做网站按钮下拉框
  • 儿童网站建设外文翻译江西有色建设集团有限公司网站
  • 山东企业建站系统费用wordpress 页面 自定义
  • 自建门户网站58同城的网站建设
  • 做网站的会什么房产中介哪家口碑比较好
  • 加若格网站做么样网站版面设计注意事项
  • 建设银行网站怎么登陆不了了辽宁省建设行业协会网站
  • 网站制作费多少重庆市建设工程招投标交易信息网
  • 广州专业做网站多少钱怎么做公众号网站
  • 功能型网站 设计男女做暖暖的免费观看网站
  • 机票网站开发知乎网站优化怎样做外链
  • 苏州建网站收费网站建设宣传视频
  • 百度网站排名软件河北网络公司排名
  • 国际网站怎么建设公司网站开发创业
  • 网站底部的图标免费版权申请入口
  • 公司网站建设推荐网站建设维护要求
  • 做seo营销网站佛山外贸seo
  • 中国建设银行网站首页joy全渠道营销的概念
  • 济南集团网站建设公司好做网站编辑有前途吗