Android创建设备节点

kernel

  1. 添加节点驱动
#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/regulator/consumer.h>


#define DEV_NAME            "chgled_chrdev"
#define DEV_CNT                 (3)
#define LED_ON                  (1)
#define LED_OFF                 (0)
int chg_led = 0 ;
int pass_chg_led = 0;
EXPORT_SYMBOL(chg_led);
EXPORT_SYMBOL(pass_chg_led);

static ssize_t chgled_show(struct device *dev,
                  struct device_attribute *attr, char *buf)
{
       pr_info("%s, %d chg_led is %d\n",__func__,__LINE__,chg_led);

       return sprintf(buf, "%d\n",chg_led);
}

static ssize_t chgled_store(struct device *dev,
                 struct device_attribute *attr,
                 const char *buf, size_t size)
{
        unsigned long state;
        ssize_t ret;

        ret = kstrtoul(buf, 10, &state);
        if (ret)
                return ret;

        pr_info("%s, %d state is %d\n",__func__,__LINE__,state);
        
        if (state == LED_ON)
                chg_led = 1;
        if (state == LED_OFF){
                chg_led = 0;
                pass_chg_led = 0;
        }
        pr_info("%s, %d chg_led is %d\n",__func__,__LINE__,chg_led);

        ret = size;

        return ret;
}
static DEVICE_ATTR_RW(chgled);


struct file_operations chg_led_ops = {
         .owner  = THIS_MODULE,
};


static dev_t  devno;
static struct class    *led_chrdev_class;
static struct device   *chgled_chrdev;

static int __init chgled_init(void)
{
        dev_t cur_dev;
        int ret = 0;

        pr_info("%s, %d \n",__func__,__LINE__);

        alloc_chrdev_region(&devno, 0, DEV_CNT, DEV_NAME);

        led_chrdev_class = class_create(THIS_MODULE, "chg_led_mode_class");

        cur_dev = MKDEV(MAJOR(devno), MINOR(devno));

        chgled_chrdev = device_create(led_chrdev_class , NULL , cur_dev , NULL , DEV_NAME);

        ret = device_create_file(chgled_chrdev , &dev_attr_chgled);
        if (ret)
                return -1;

        return 0;
}
module_init(chgled_init);

static void __exit chgled_exit(void)
{
        dev_t cur_dev;
        pr_info("%s, %d \n",__func__,__LINE__);

        cur_dev = MKDEV(MAJOR(devno), MINOR(devno));

        device_destroy(led_chrdev_class, cur_dev);

        unregister_chrdev_region(devno, DEV_CNT);

        class_destroy(led_chrdev_class);

        device_remove_file(chgled_chrdev , &dev_attr_chgled);

}
module_exit(chgled_exit);

MODULE_LICENSE("GPL");
  1. 配置Kconfig
alps/kernel-5.10/drivers/misc/Kconfig
config CHG_LED
        tristate "CHARGER LED"
        depends on I2C
         default y
        help
          This driver provides support for CHARGER LED
  1. 配置Makefile
alps/kernel-5.10/drivers/misc/Makefile
obj-$(CONFIG_CHG_LED)        += charger_led.o
  1. 配置内核编译项
alps/kernel-5.10/arch/arm64/configs/mgk_64_k510_defconfig
CONFIG_CHG_LED=m
  1. 添加ko表,注意添加位置
alps/kernel-5.10/device/mediateksample/tb8781p1_64/ko_order_table.csv
charger_led.ko,/drivers/misc/charger_led.ko,ramdisk,Y,Y,user/userdebug/eng

HAL层

  1. 添加bin文件
alps_a12/vendor/mediatek/proprietary/external/sensor-tools
  1. 配置device.mk
alps/device/mediatek/vendor/common/device.mk
或者alps/device/mediatek/vendor/mgvi_t_64_armv82/device.mk

PRODUCT_PACKAGES += libchgled
PRODUCT_PACKAGES += libdischgled
  1. 添加服务
    alps/device/mediateksample/tb8781p1_64/init.project.rc
service chgled /vendor/bin/libchgled
    user root
    group root drmrpc system
    class main
    seclabel u:r:chgled:s0
    oneshot
    disabled

service dischgled /vendor/bin/libdischgled
    user root
    group root drmrpc system
    class main
    seclabel u:r:dischgled:s0
    oneshot
    disabled
  1. 添加权限
    alps_a12/device/mediatek/sepolicy/basic/non_plat
diff --git a/non_plat/chgled.te b/non_plat/chgled.te
new file mode 100644
index 0000000..f6e7d50
--- /dev/null
+++ b/non_plat/chgled.te
@@ -0,0 +1,15 @@
+type chgled, domain;
+type chgled_exec, exec_type,vendor_file_type,file_type;
+init_daemon_domain(chgled)
+
+allow chgled sysfs:file{open write read getattr};
+allow chgled metadata_file:dir search;
+allow chgled proc_cmdline:file read;
+allow chgled sysfs_dt_firmware_android:dir search;
+allow chgled gsi_metadata_file:dir search;
+allow chgled proc_cmdline:file open;
+allow chgled sysfs_dt_firmware_android:file read;
+allow chgled block_device:dir search;
+allow chgled proc_cmdline:file { open read getattr};
+allow chgled sysfs_dt_firmware_android:file { getattr open read };
+allow chgled nvram_device:blk_file {open read write};
diff --git a/non_plat/file_contexts b/non_plat/file_contexts
index 52325a7..da6992d 100755
--- a/non_plat/file_contexts
+++ b/non_plat/file_contexts
@@ -971,6 +971,7 @@
 /vendor/bin/libwakechg          u:object_r:wakechg_exec:s0
 /vendor/bin/libdiswakechg          u:object_r:diswakechg_exec:s0
 /vendor/bin/libbypass          u:object_r:bypass_mode_exec:s0
+/vendor/bin/libchgled          u:object_r:chgled_exec:s0
 # Date:2021/07/27
  # Purpose: permission for CCB user
 /dev/ccci_ccb_ctrl  u:object_r:ccci_ccb_device:s0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值