IMX6ULL嵌入式Linux驱动学习
IMX6ULL-Linux开发学习
以下内容是我在学习正点原子IMX6ULL开发板alpha中记录的笔记,部分摘录自正点原子IMX6ULL开发手册。
一、地址映射
-
因为
linux使用MMC,因此在驱动开发时,不能直接对寄存器物理地址进行读写操作。 -
在
linux里面操作的都是虚拟地址,所以需要先得到物理地址对应的虚拟地址。获得物理地址对应的虚拟地址使用va = ioremap(cookie,size)函数,第一个参数是物理地址起始地址,第二个参数就是要转换的字节数量,返回的是申请到的虚拟地址。卸载驱动的时候使用iounmap(va); -
操作虚拟地址时使用
readb(const volatile void __iomem *addr)8bitreadw(const volatile void __iomem *addr)16bitreadl(const volatile void __iomem *addr)32bitwriteb(u8 value,volatile void __iomem *addr)8bitwritew(u16 value, volatile void __iomem *addr)16bitwritel(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")

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

被折叠的 条评论
为什么被折叠?



