首页 > 系统相关 >Linux设备驱动器 之二 线程同步第二篇

Linux设备驱动器 之二 线程同步第二篇

时间:2024-07-11 13:55:07浏览次数:18  
标签:... struct lock ftdi 线程 Linux mutex 驱动器 op

Linux设备驱动器 之二 线程同步第二篇

mutex

数据结构

struct mutex {
    atomic_long_t       owner;
    raw_spinlock_t      wait_lock;
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
    struct optimistic_spin_queue osq; /* Spinner MCS lock */
#endif
    struct list_head    wait_list;
#ifdef CONFIG_DEBUG_MUTEXES
    void            *magic;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
    struct lockdep_map  dep_map;
#endif
};

Linux APIs

 void mutex_init(struct mutex *lock);
 bool mutex_is_locked(struct mutex *lock);
 void mutex_lock(struct mutex *lock);
 int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock);
 int mutex_trylock(struct mutex *lock);
 void mutex_unlock(struct mutex *lock);

在Linux驱动器中的应用

NXP freescale系列QSPI 驱动器

变量定义
struct fsl_qspi {
...
    struct mutex lock;
...
};
初始化
static int fsl_qspi_probe(struct platform_device *pdev) {
     ...
     mutex_init(&q->lock);
     ...
}
存取数据

如果有大块数据,使用AHB总线,通过存取映射的存储器,存取数据。

static int fsl_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
{
	...
	mutex_lock(&q->lock);
	...
	fsl_qspi_prepare_lut(q, op);
    /*
     * If we have large chunks of data, we read them through the AHB bus
     * by accessing the mapped memory. In all other cases we use
     * IP commands to access the flash.
     */
    if (op->data.nbytes > (q->devtype_data->rxfifo - 4) &&
        op->data.dir == SPI_MEM_DATA_IN) {
        fsl_qspi_read_ahb(q, op);
    } else {
        qspi_writel(q, QUADSPI_RBCT_WMRK_MASK |
                QUADSPI_RBCT_RXBRD_USEIPS, base + QUADSPI_RBCT);
        if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT)
            fsl_qspi_fill_txfifo(q, op);
        err = fsl_qspi_do_op(q, op);
    }
    /* Invalidate the data in the AHB buffer. */
    fsl_qspi_invalidate(q);
	mutex_unlock(&q->lock);
}

semaphore

数据结构

struct semaphore {
    raw_spinlock_t      lock;
    unsigned int        count;
    struct list_head    wait_list;
};

Linux APIs

void sema_init(struct semaphore *sem, int val);
void down(struct semaphore *sem);
int down_interruptible(struct semaphore *sem);
int down_trylock(struct semaphore *sem);
int down_timeout(struct semaphore *sem, long jiffies);
void up(struct semaphore *sem);

在Linux驱动器中的应用

ELAN 的 Uxxx 系列驱动器

ELAN 的 Uxxx 系列适配器是 USB 转 PCMCIA CardBus 适配器

变量定义
struct usb_ftdi {
    ...
    struct semaphore sw_lock;
    ...
};
初始化
static inline void usb_set_intfdata(struct usb_interface *intf, void *data)
{
    dev_set_drvdata(&intf->dev, data);
}

static int ftdi_elan_probe(struct usb_interface *interface, const struct usb_device_id *id)
 {
     ...
     sema_init(&ftdi->sw_lock, 1);
     ...
     usb_set_intfdata(interface, ftdi);
 	 ...
 }

usb_set_intfdata将FTDI的驱动器数据写入驱动器的数据结构变量中。在需要的生活可以通过驱动器结构变量存取。

同步操作
static void ftdi_elan_status_work(struct work_struct *work)
{
    ...
	if(ftdi->disconnected > 0){
		....
	} else if (ftdi->synchronized == 0) {
        down(&ftdi->sw_lock);
        if (ftdi_elan_synchronize(ftdi) == 0) {
            ftdi->synchronized = 1;
            ftdi_command_queue_work(ftdi, 1);
            ftdi_respond_queue_work(ftdi, 1);
            up(&ftdi->sw_lock);
            work_delay_in_msec = 100;
        } else {
            dev_err(&ftdi->udev->dev, "synchronize failed\n");
            up(&ftdi->sw_lock);
            work_delay_in_msec = 10 *1000;
        }
    }
    ...
}

down(&ftdi->sw_lock),up(&ftdi->sw_lock); 保证一个线程进行同步过程。
down(&ftdi->sw_lock) 让当前线程拥有这个semaphore,其他线程无法再次进入同步过程。在同步过程完成后,当前线程释放semaphore。

标签:...,struct,lock,ftdi,线程,Linux,mutex,驱动器,op
From: https://blog.csdn.net/IT_Beijing_BIT/article/details/140341873

相关文章

  • Linux系统基础学习
    系统目录结构目录结构登录系统之后输入ls命令查看系统目录系统常用的目录/bin存放着最常用的命令,包括用户和系统管理员都会使用的命令。/boot存放启动linux的核心文件,包括内核文件、引导文件、镜像文件/dev存放着Linux系统中所有的设备文件,如硬盘、CD-ROM等/home......
  • 理解 Linux 文件权限(2)& vim编辑器
    1、如何理解文件权限1)查看文件• 想要理解文件权限,需要先从查看文件入手•使用ls–l命令查看Linux系统上的文件、目录和设备的权限①对象的类型②文件属性③目录/链接个数④所有者(owner)⑤组(group)⑥文件大小⑦最后修改的日期⑧文件名其中:• ①代表了对象的类型:......
  • Linux Conda简介
    LinuxConda环境是一种在Linux操作系统中使用Conda(Conda是一种开源的包管理器和环境管理系统)来配置、管理和隔离不同版本的Python及其依赖库的技术方案。具体来说,Conda环境提供以下功能:1.**环境隔离**:用户可以为不同的项目创建独立的运行环境,每个环境可以有其自己的Python版......
  • 在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网
    在Linux中,可以使用iptables工具来实现端口转发。以下是将本地80端口的请求转发到8080端口的命令:首先,确保iptables已经安装在你的系统上。如果没有安装,可以使用以下命令安装:对于Debian/Ubuntu系统:sudoapt-getinstalliptables对于CentOS/RHEL系统:sudoyuminstalliptabl......
  • 在Linux中,ptables是否支持time时间控制用户行为,如有请写出具体操作步骤。
    在Linux中,iptables是一个非常强大的防火墙工具,用于配置网络传输相关规则。然而,iptables本身并不支持基于时间的规则控制,也就是说,它不能直接根据时间来控制用户行为或网络流量。iptables的规则是基于包的源地址、目的地址、端口号、协议类型等来决定是否允许或拒绝数据包。但是......
  • 在Linux中,包过滤防火墙与代理应用防火墙有什么区别?有哪些相应的产品?
    在Linux中,包过滤防火墙与代理应用防火墙是两种不同类型的防火墙技术,它们在多个方面存在显著的区别。以下是对这两种防火墙技术的详细比较,以及相应的产品示例。一、包过滤防火墙1.定义与工作原理包过滤防火墙是一种基于网络层和传输层的安全系统,它根据预定义的规则集对经过网络......
  • 在Linux中,有哪几种linux/unix发行版本?
    Linux/Unix发行版是指基于Linux内核或类Unix操作系统的不同版本,它们各自带有不同的工具集、软件包管理器、桌面环境、系统配置工具和服务,以满足不同用户的需求。以下是一些较为知名和流行的Linux/Unix发行版:DebianDebian是一个由志愿者社区维护的稳定发行版,以其高质量的软件......
  • C#Worker Service征服Linux:从零到部署英雄的跨界之旅
    ......
  • Linux 基础指令
    来自......
  • linux文件系统损坏如何修复
    修复损坏的Linux文件系统的方法取决于具体的损坏原因和文件系统类型。以下是一些常见的修复方法:使用fsck命令:打开终端并以root用户身份登录。运行fsck命令来检查和修复文件系统。例如,如果文件系统是ext4类型,可以运行fsck.ext4/dev/sda1来检查和修复/dev/sda1分区上的文件系统......