IMX6ULL嵌入式Linux驱动学习笔记(三)

本文介绍基于IMX6ULL开发板的Linux LED驱动开发过程,包括地址映射、驱动程序编写、应用程序编写及测试步骤。通过具体实例展示了如何进行LED灯的控制。

IMX6ULL-Linux开发学习

以下内容是我在学习正点原子IMX6ULL开发板alpha中记录的笔记,部分摘录自正点原子IMX6ULL开发手册

一、地址映射

  1. 因为linux使用MMC,因此在驱动开发时,不能直接对寄存器物理地址进行读写操作。

  2. linux里面操作的都是虚拟地址,所以需要先得到物理地址对应的虚拟地址。获得物理地址对应的虚拟地址使用va = ioremap(cookie,size)函数,第一个参数是物理地址起始地址,第二个参数就是要转换的字节数量,返回的是申请到的虚拟地址。卸载驱动的时候使用iounmap(va)

  3. 操作虚拟地址时使用

    • readb(const volatile void __iomem *addr) 8bit
    • readw(const volatile void __iomem *addr) 16bit
    • readl(const volatile void __iomem *addr) 32bit
    • writeb(u8 value,volatile void __iomem *addr) 8bit
    • writew(u16 value, volatile void __iomem *addr) 16bit
    • writel(u32 value, volatile void __iomem *addr) 32bit
/**
 * @brief 出口
 * */
static int __init led_init(void)
{
   
   
	int ret = 0;
	unsigned int val = 0;
	/* 初始化LED灯,地址映射 */
	CCM_CCGR1 = ioremap(CCM_CCGR1_BASE, 4);
	SW_MUX_GPIO1_IO03 = ioremap(SW_MUX_GPIO1_IO03_BASE, 4);
	SW_PAD_GPIO1_IO03 = ioremap(SW_PAD_GPIO1_IO03_BASE, 4);
	GPIO1_GDIR = ioremap(GPIO1_GDIR_BASE, 4);
	GPIO1_DR = ioremap(GPIO1_DR_BASE, 4);

	/* 初始化 */
	val = readl(CCM_CCGR1);
	val &= ~(3 << 26);
	val |= (3 << 26);
	writel(val, CCM_CCGR1);	// 使能时钟

	writel(0x5, SW_MUX_GPIO1_IO03);		// 设置复用
	writel(0x10b0, SW_PAD_GPIO1_IO03);	// 设置电气属性
	
	val = readl(GPIO1_GDIR);
	val |= (1 << 3);
	writel(val, GPIO1_GDIR);	// 设置输出

	val = readl(GPIO1_DR);
	val &= ~(1 << 3);
	writel(val, GPIO1_DR);	// 默认打开LED

	ret = register_chrdev(LED_MAJOR, LED_NAME, &led_fops);
	if (ret < 0)
	{
   
   
		printk("led_init failed! \r\n")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值