IMX6ULL 学习笔记 SR501驱动框架搭建1

一、分析需求

1.看sch:怎么操作
在这里插入图片描述

2.规划驱动功能(不一定全都要实现)

	APP 		open 			poll 				read
	DRV 	drv_open 		drv_poll 			drv_read
	例如 查询 、poll、休眠唤醒、异步通知等功能

3.写驱动/测试程序
在这里插入图片描述
在写驱动时可多参考源码里的驱动文件

二、构造设备树

1.可以先打开该目录下的dts文件作为参考
在这里插入图片描述
2.打开dts文件后,输入/gpio进行搜索
在这里插入图片描述
3.最终结果,将结果加入dts文件中,不是新加文件

在这里插入图片描述

	sr501{
   
	compatible =100ask,sr501”;
	gpios = <&gpio4 19 GPIO_ACTIVE_HIGH>;
	}

在.dts文件的每个设备,都有一个compatible属性,compatible属性用户驱动和设备的绑定。

不同芯片的dts主要是gpios= <&gpio4 19 GPIO_ACTIVE_HIGH>;的写法不同,gpio-cells =2代表需要两个整形代表gpio口

在这里插入图片描述

三、实现驱动框架

1.平台DEV与平台DRV配对规则

	嵌入式Linux应用开发完全手册V4.0_韦东山全系列视频文档-IMX6ULL开发板P 549,11.5节

在这里插入图片描述
2.参考以前程序,修改名称,删减程序

#include <linux/module.h>
#include <linux/poll.h>

#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <linux/gpio/consumer.h>
#include <linux/platform_device.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/slab.h>
#include <linux/fcntl.h>
#include <linux/timer.h>
#include <linux/workqueue.h>
#include <asm/current.h>


struct gpio_key{
   
	int gpio;
	struct gpio_desc *gpiod;
	int flag;
	int irq;
	struct timer_list key_timer;
	struct tasklet_struct tasklet;
	struct work_struct work;
} ;

static struct gpio_key *gpio_keys_100ask;

/* 主设备号                                                                 */
static int major = 0;
static struct class *gpio_key_class;

/* 环形缓冲区 */
#define BUF_LEN 128
static int g_keys[BUF_LEN];
static int r, w;

struct fasync_struct *button_fasync;

#define NEXT_POS(x) ((x+1) % BUF_LEN)

static int is_key_buf_empty(void)
{
   
	return (r == w);
}

static int is_key_buf_full(void)
{
   
	return (r == NEXT_POS(w));
}

static void put_key(int key)
{
   
	if (!is_key_buf_full())
	{
   
		g_keys[w] = key;
		w = NEXT_POS(w);
	}
}

static int get_key(void)
{
   
	int key = 0;
	if (!is_key_buf_empty())
	{
   
		key = g_keys[r];
		r = NEXT_POS(r);
	}
	return key;
}


static
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要确认SR8201FN网卡是否是通过SPI接口与imx6ull交互。如果是,则需要在uboot中添加SPI驱动,并在SPI驱动中添加SR8201FN网卡的驱动支持。 以下是添加SPI驱动的步骤: 1. 打开uboot源码目录中的configs目录,复制一个与你的开发板相似的配置文件,例如mx6ull_14x14_evk_defconfig,重命名为你自己的配置文件名。 2. 在你的配置文件中,添加以下配置选项: ``` CONFIG_SPI=y CONFIG_DM_SPI=y CONFIG_SPI_FLASH=y ``` 3. 如果你的开发板中使用的SPI控制器不同于MX6UL/DL内置的ECspi控制器,则需要添加SPI控制器的驱动支持,例如,如果你的开发板使用的是MX6ULL内置的QSPI控制器,则需要添加以下配置选项: ``` CONFIG_SPI_MXS_QSPI=y CONFIG_SPI_FLASH_SPANSION=y ``` 4. 如果你的开发板中使用的SPI接口与SR8201FN网卡连接,则需要添加SR8201FN网卡的驱动支持。你可以从SR8201FN网卡的官网下载驱动程序,并将其添加到uboot源码的drivers目录中。然后在你的配置文件中添加以下配置选项: ``` CONFIG_DM_ETH=y CONFIG_CMD_NET=y ``` 5. 在你的配置文件中添加以下配置选项启用SR8201FN网卡的驱动支持: ``` CONFIG_ETH_DESIGNWARE=y CONFIG_ETH_DESIGNWARE_SPI=y CONFIG_ETH_DESIGNWARE_SPI_BUS_MAX=1 CONFIG_DM_ETH_SPI=y CONFIG_MII=y CONFIG_PHYLIB=y CONFIG_PHYLIB_10G=y CONFIG_PHY_ATHEROS=y CONFIG_PHYLIB_ETHERNET=y CONFIG_PHYLIB_MICREL=y CONFIG_PHYLIB_NETPHY=y CONFIG_PHYLIB_REALTEK=y CONFIG_PHYLIB_SMSC=y CONFIG_DM_GPIO=y CONFIG_DM_SPI_FLASH=y CONFIG_DM_SPI=y CONFIG_DM_SPI_SLAVE=y CONFIG_SPI_FLASH=y CONFIG_CMD_SPI=y CONFIG_SPI_FLASH_MTD=y CONFIG_DM_SPI_FLASH_MTD=y CONFIG_SPI_FLASH_BAR=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_STMICRO=y CONFIG_SPI_FLASH_SST=y CONFIG_SPI_FLASH_WINBOND=y ``` 6. 将你的配置文件编译成uboot二进制文件并烧写到开发板中,测试SR8201FN网卡是否工作正常。 以上是添加SR8201FN网卡驱动的大致步骤,具体实现可能会因为开发板和uboot版本的不同而略有不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值