IMX8平台在 在/sys下面创建一些目录,并创建一些文件用于保存开发板特有的UID提供给应用层使用.

废话不多说,直接贴上代码,在代码里面解释具体的步骤:

#include <linux/netdevice.h>
#include <linux/phy.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kobject.h>
#include <linux/device.h>
#include <soc/imx8/sc/sci.h>



#define IMX8QXP_FUSE_UUID_WORD0		0x10
#define IMX8QXP_FUSE_UUID_WORD1		0x11

static uint32_t val = 0;

static struct kobject *k_obj = NULL;

static uint32_t imx8qxp_get__UID_from_fuse(int add)
{
	
	uint32_t mu_id;
	sc_ipc_t ipc_handle;
	sc_err_t sc_err = SC_ERR_NONE;
	uint32_t val = 0;
	uint32_t word;

	
	sc_err = sc_ipc_getMuID(&mu_id);
		if (sc_err != SC_ERR_NONE) {
			pr_err("FEC MAC fuse: Get MU ID failed\n");
			return;
		}
	
	sc_err = sc_ipc_open(&ipc_handle, mu_id);
	if (sc_err != SC_ERR_NONE) {
		pr_err("FEC MAC fuse: Open MU channel failed\n");
		return;
	}

	word = add;
	
	sc_err = sc_misc_otp_fuse_read(ipc_handle, word, &val);//调用函数读取地址存的信息
	if (sc_err != SC_ERR_NONE) {
		pr_err("FEC UUID fuse %d read error: %d\n", word, sc_err);
		sc_ipc_close(ipc_handle);
		return;
	}
	return val;
}



static ssize_t sysfs_demo_show_node_one(struct kobject *kobj, struct kobj_attribute *attr, char * buf)
{

    return sprintf(buf, "%s: %s\n", attr->attr.name, imx8qxp_get__UID_from_fuse(IMX8QXP_FUSE_UUID_WORD0));
}

static ssize_t sysfs_demo_show_node_two(struct kobject *kobj, struct kobj_attribute *attr, char * buf)
{

    return sprintf(buf, "%s: %s\n", attr->attr.name,imx8qxp_get__UID_from_fuse(IMX8QXP_FUSE_UUID_WORD1));
}

static struct kobj_attribute node_one_attribute =  //创建的文件的信息
    __ATTR(HW_OCOTP_CFG0, S_IWUSR|S_IRUGO, sysfs_demo_show_node_one, NULL);
    
static struct kobj_attribute node_two_attribute =//创建的文件的信息
    __ATTR(HW_OCOTP_CFG1, S_IWUSR|S_IRUGO, sysfs_demo_show_node_two, NULL);

static struct attribute *sysfs_demo_attributes[] = {
    &node_one_attribute.attr,
    &node_two_attribute.attr,
    NULL
};

static const struct attribute_group sysfs_demo_attr_group = {
    .attrs = sysfs_demo_attributes,
};

static int __init sysfs_demo_init(void)
{
    if ((k_obj = kobject_create_and_add("fsl_otp", NULL)) == NULL ) {//创建fsl_otp目录
        pr_err("fsl_otp sys node create error \n");
        goto out;
    }

    if(sysfs_create_group(k_obj, &sysfs_demo_attr_group) ) {//在建好的目录下创建文件
        pr_err("sysfs_create_group failed\n");
        goto out2;
    }
	
    pr_info("enter.\n");
    return 0;
out2:
    kobject_put(k_obj);
out:
    return -1;
}
module_init(sysfs_demo_init); //函数入口

static void __exit sysfs_demo_exit(void)
{
    pr_info("enter.\n");

    if (k_obj) {
        sysfs_remove_group(k_obj, &sysfs_demo_attr_group);
        kobject_put(k_obj);
    }

}
module_exit(sysfs_demo_exit);

MODULE_LICENSE("GPL");


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,使用以下命令安装 cfdisk: ``` sudo apt-get install cfdisk ``` 然后,将 SD 卡插入计算机,并使用以下命令查看 SD 卡设备名称: ``` sudo fdisk -l ``` 假设设备名称为 `/dev/sdb`,接下来使用以下命令启动 cfdisk: ``` sudo cfdisk /dev/sdb ``` 在 cfdisk 中,可以使用箭头键和 Enter 键来创建分区。创建四个分区: - U-Boot 分区,大小为 1 MB,文件系统类型为 FAT32 - 内核分区,大小为 8 MB,文件系统类型为 FAT32 - 设备树分区,大小为 1 MB,文件系统类型为 FAT32 - 根文件系统分区,大小为剩余空间,文件系统类型为 ext4 创建分区后,使用以下命令格式化每个分区: ``` sudo mkfs.fat -F 32 /dev/sdb1 sudo mkfs.fat -F 32 /dev/sdb2 sudo mkfs.fat -F 32 /dev/sdb3 sudo mkfs.ext4 /dev/sdb4 ``` 接下来,创建四个目录用于挂载之前创建的分区: ``` sudo mkdir /mnt/uboot sudo mkdir /mnt/kernel sudo mkdir /mnt/dtb sudo mkdir /mnt/rootfs ``` 然后,使用以下命令将每个分区挂载到相应的目录: ``` sudo mount /dev/sdb1 /mnt/uboot sudo mount /dev/sdb2 /mnt/kernel sudo mount /dev/sdb3 /mnt/dtb sudo mount /dev/sdb4 /mnt/rootfs ``` 接下来,将 U-Boot、内核、设备树文件以及根文件系统复制到相应的目录中: ``` sudo cp u-boot.imx /mnt/uboot/ sudo cp uImage /mnt/kernel/ sudo cp imx6qp-sabreauto.dtb /mnt/dtb/ sudo cp rootfs.tar.gz /mnt/rootfs/ ``` 最后,卸载分区并拔出 SD 卡: ``` sudo umount /mnt/uboot sudo umount /mnt/kernel sudo umount /mnt/dtb sudo umount /mnt/rootfs sudo eject /dev/sdb ``` 现在,SD 卡已经准备好,可以插入到目标设备中并引导启动了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值