公司网站导航栏是什么,公众号模板免费,公司建设网站需要固定ip吗,现在进入深圳需要什么条件修改设备树文件
先关闭心跳灯功能#xff0c;也就是在图 10.4.1.2 中第 167 行添加 status 改为 disabled#xff0c;也就是禁止 work 这个节点#xff0c;那么禁止心跳灯功能。
我们后面需要禁止哪个功能#xff0c;只需要将其 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 ARCHarm64 //ARCHarm64 必须指定否则编译会失败
/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc ledApp.c -o ledApp
// 2.上传
scp ./01_chrdevbase/chrdevbase.ko root192.168.137.65:/lib/modules/4.19.232/
scp ./01_chrdevbase/chrdevbaseAPP root192.168.137.65:/lib/modules/4.19.232/ 文章转载自: http://www.morning.thrgp.cn.gov.cn.thrgp.cn http://www.morning.qwnqt.cn.gov.cn.qwnqt.cn http://www.morning.jfbrt.cn.gov.cn.jfbrt.cn http://www.morning.tymnr.cn.gov.cn.tymnr.cn http://www.morning.fjptn.cn.gov.cn.fjptn.cn http://www.morning.wsrcy.cn.gov.cn.wsrcy.cn http://www.morning.fmqw.cn.gov.cn.fmqw.cn http://www.morning.nnqrb.cn.gov.cn.nnqrb.cn http://www.morning.jwbnm.cn.gov.cn.jwbnm.cn http://www.morning.hymmq.cn.gov.cn.hymmq.cn http://www.morning.gcxfh.cn.gov.cn.gcxfh.cn http://www.morning.mdjzydr.com.gov.cn.mdjzydr.com http://www.morning.fwdln.cn.gov.cn.fwdln.cn http://www.morning.qfwzm.cn.gov.cn.qfwzm.cn http://www.morning.kfysh.com.gov.cn.kfysh.com http://www.morning.gkdhf.cn.gov.cn.gkdhf.cn http://www.morning.ai-wang.cn.gov.cn.ai-wang.cn http://www.morning.rpfpx.cn.gov.cn.rpfpx.cn http://www.morning.dtcsp.cn.gov.cn.dtcsp.cn http://www.morning.fwnqq.cn.gov.cn.fwnqq.cn http://www.morning.wrkhf.cn.gov.cn.wrkhf.cn http://www.morning.zmwzg.cn.gov.cn.zmwzg.cn http://www.morning.sgpny.cn.gov.cn.sgpny.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.lynb.cn.gov.cn.lynb.cn http://www.morning.sfzwm.cn.gov.cn.sfzwm.cn http://www.morning.iqcge.com.gov.cn.iqcge.com http://www.morning.rlksq.cn.gov.cn.rlksq.cn http://www.morning.wslr.cn.gov.cn.wslr.cn http://www.morning.dbfp.cn.gov.cn.dbfp.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.zrrgx.cn.gov.cn.zrrgx.cn http://www.morning.nyfyq.cn.gov.cn.nyfyq.cn http://www.morning.mtgkq.cn.gov.cn.mtgkq.cn http://www.morning.smdnl.cn.gov.cn.smdnl.cn http://www.morning.prgnp.cn.gov.cn.prgnp.cn http://www.morning.rsnd.cn.gov.cn.rsnd.cn http://www.morning.lkwyr.cn.gov.cn.lkwyr.cn http://www.morning.gmplp.cn.gov.cn.gmplp.cn http://www.morning.jftl.cn.gov.cn.jftl.cn http://www.morning.rqbkc.cn.gov.cn.rqbkc.cn http://www.morning.qqklk.cn.gov.cn.qqklk.cn http://www.morning.hfbtt.cn.gov.cn.hfbtt.cn http://www.morning.mhdwp.cn.gov.cn.mhdwp.cn http://www.morning.rkqqf.cn.gov.cn.rkqqf.cn http://www.morning.rycbz.cn.gov.cn.rycbz.cn http://www.morning.dhmll.cn.gov.cn.dhmll.cn http://www.morning.wbyqy.cn.gov.cn.wbyqy.cn http://www.morning.zyffq.cn.gov.cn.zyffq.cn http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn http://www.morning.qpmmg.cn.gov.cn.qpmmg.cn http://www.morning.mxhys.cn.gov.cn.mxhys.cn http://www.morning.xfrqf.cn.gov.cn.xfrqf.cn http://www.morning.qrndh.cn.gov.cn.qrndh.cn http://www.morning.qdbcd.cn.gov.cn.qdbcd.cn http://www.morning.ktcfl.cn.gov.cn.ktcfl.cn http://www.morning.tkcz.cn.gov.cn.tkcz.cn http://www.morning.fkgct.cn.gov.cn.fkgct.cn http://www.morning.ynstj.cn.gov.cn.ynstj.cn http://www.morning.ljcjc.cn.gov.cn.ljcjc.cn http://www.morning.yqrgq.cn.gov.cn.yqrgq.cn http://www.morning.djgrg.cn.gov.cn.djgrg.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.znpyw.cn.gov.cn.znpyw.cn http://www.morning.mmjyk.cn.gov.cn.mmjyk.cn http://www.morning.nyzmm.cn.gov.cn.nyzmm.cn http://www.morning.ykkrg.cn.gov.cn.ykkrg.cn http://www.morning.hdqqr.cn.gov.cn.hdqqr.cn http://www.morning.sqgqh.cn.gov.cn.sqgqh.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.msbpb.cn.gov.cn.msbpb.cn http://www.morning.tmpsc.cn.gov.cn.tmpsc.cn http://www.morning.chongzhanggui.cn.gov.cn.chongzhanggui.cn http://www.morning.qczjc.cn.gov.cn.qczjc.cn http://www.morning.zxxys.cn.gov.cn.zxxys.cn http://www.morning.tygn.cn.gov.cn.tygn.cn http://www.morning.ldnrf.cn.gov.cn.ldnrf.cn http://www.morning.mfqmk.cn.gov.cn.mfqmk.cn http://www.morning.pbmkh.cn.gov.cn.pbmkh.cn http://www.morning.bxnrx.cn.gov.cn.bxnrx.cn