嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第七天-内核函数接口(物联技术666)

链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd=1688
提取码:1688

//**************************************************

#include <linux/module.h> /*module_init()*/

#include <linux/kernel.h> /* printk() */

#include <linux/init.h> /* __init __exit */

#include <linux/fs.h> /* file_operation */

#include <asm/uaccess.h> /* copy_to_user, copy_from_user */

#include <linux/device.h> /*class ,class_create ,device_create 等*/

#include <linux/errno.h> /* Error number */

#include <linux/delay.h> /* udelay */

#include <mach/regs-gpio.h> /*S3C2410_GPGCON ,S3C2410_GPIO_IRQ*/

#include <linux/pci.h> /*S3C24XX_VA_GPIO*/

#include <linux/irq.h> //set_irq_type ,IRQ_TYPE_EDGE_FALLING

#include <linux/interrupt.h> //request_irq , free_irq

#include <mach/irqs.h> //IRQ_EINT2

#include <linux/gpio.h> //s3c2410_gpio_cfgpin();

#include <linux/workqueue.h> //workqueue

#include <linux/kfifo.h> //kfifo

#include <linux/slab.h>

#include <linux/slab_def.h> //malloc

#include <linux/string.h> //string

#include <linux/spinlock.h> //自旋锁spin

#include <linux/mutex.h> //互斥锁mutex

#include <linux/poll.h> //poll_wait()

#include <linux/sched.h> //wake_up_interruptible->TASK_INTERRUPTIBLE,current

#include <linux/timer.h> //定时器

#include <linux/jiffies.h> //内部计数器值

#include <linux/wait.h> //

#include <linux/kthread.h> //kthread_create()、kthread_run()

#include <linux/err.h> //IS_ERR()、PTR_ERR()

//**************************************************

I/O 函数:

//***************************************************

**寄存器地址映射:**linux用的是虚拟地址,而裸机用的是物理地址,要像裸机一样设置IO口必须转换一下地址。

#include <mach/regs-gpio.h>

#include <linux/pci.h>

#include <linux/gpio.h>

#define GPGCON (*(volatile unsigned long *)S3C2410_GPGCON)

#define GPGDAT (*(volatile unsigned long *)S3C2410_GPGDAT)

#define GPGUP (*(volatile unsigned long *)S3C2410_GPGUP)

同理,其他IO口也可以类似转换。

//设置IO状态

s3c2410_gpio_cfgpin(S3C2410_GPG(0),S3C2410_GPIO_INPUT);

s3c2410_gpio_cfgpin(S3C2410_GPG(1),S3C2410_GPIO_OUTPUT);

//IO置1或者清0

s3c2410_gpio_setpin(S3C2410_GPG(0), 0);

s3c2410_gpio_setpin(S3C2410_GPG(1), 1);

unsigned int s3c2410_gpio_getpin(unsigned int pin)

{

void __iomem *base = S3C24XX_GPIO_BASE(pin);

unsigned long offs = S3C2410_GPIO_OFFSET(pin);

return __raw_readl(base + 0x04) & (1<< offs);

}

s3c2410_gpio_getpin()的返回值是GPxDAT寄存器的值与所要读取的GPIO对应的bit mask相与以后的值,0表示该GPIO对应的bit为0, 非0表示该bit为1,所以s3c2410_gpio_getpin(S3C2410_GPG(9))如果GPG9为低电平则返回的是0,如果是高电平则返回的是GPxDAT中的GPG9对应位的值为0x0100而不是0x0001,查处问题后修改也很简单了。

//****************************************************

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言