#include #include #include #include #include #include #include #include #include #include #define device_name "leds" /* 載入模式後,執行」cat /proc/devices」命令看到的裝置名稱 */
#define led_major 231 /* 主裝置號 */
static struct class *leds_class;
static struct class_device *leds_class_devs[4];
/* bit0<=>d10, 0:亮, 1:滅
* bit1<=>d11, 0:亮, 1:滅
* bit2<=>d12, 0:亮, 1:滅
*/ static char leds_status = 0x0;
static declare_mutex(leds_lock); // 定義賦值
//static int minor;
static unsigned long gpio_va;
#define gpio_oft(x) ((x) - 0x56000000)
#define gpfcon (*(volatile unsigned long *)(gpio_va + gpio_oft(0x56000050)))
#define gpfdat (*(volatile unsigned long *)(gpio_va + gpio_oft(0x56000054)))
/* 應用程式對裝置檔案/dev/leds執行open(...)時,
* 就會呼叫s3c24xx_leds_open函式
*/static int s3c24xx_leds_open(struct inode *inode, struct file *file)
case 1: /* /dev/led1 */
case 2: /* /dev/led2 */
case 3: /* /dev/led3 */
} return 0;
}static int s3c24xx_leds_read(struct file *filp, char __user *buff,
size_t count, loff_t *offp)
case 1: /* /dev/led1 */
case 2: /* /dev/led2 */
case 3: /* /dev/led3 */
}return 1;
}static ssize_t s3c24xx_leds_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
case 1: /* /dev/led1 */
else
break;
}case 2: /* /dev/led2 */
else
break;
}case 3: /* /dev/led3 */
else
break;}}
return 1;
}/* 這個結構是字元裝置驅動程式的核心
* 當應用程式操作裝置檔案時所呼叫的open、read、write等函式,
* 最終會呼叫這個結構中指定的對應函式
*/static struct file_operations s3c24xx_leds_fops = ;
/* * 執行insmod命令時就會呼叫這個函式
*/static int __init s3c24xx_leds_init(void)
//static int __init init_module(void)
/* 註冊字元裝置
* 引數為主裝置號、裝置名字、file_operations結構;
* 這樣,主裝置號就和具體的file_operations結構聯絡起來了,
* 操作主裝置為led_major的裝置檔案時,就會呼叫s3c24xx_leds_fops中的相關成員函式
* led_major可以設為0,表示由核心自動分配主裝置號
*/ret = register_chrdev(led_major, device_name, &s3c24xx_leds_fops);
if (ret < 0)
leds_class = class_create(this_module, "leds");
if (is_err(leds_class))
return ptr_err(leds_class);
leds_class_devs[0] = class_device_create(leds_class, null, mkdev(led_major, 0), null, "leds");
for (minor = 1; minor < 4; minor++)
printk(device_name " initialized\n");
return 0;}/*
* 執行rmmod命令時就會呼叫這個函式
*/static void __exit s3c24xx_leds_exit(void)
class_destroy(leds_class);
iounmap(gpio_va);
}/* 這兩行指定驅動程式的初始化函式和解除安裝函式 */
module_init(s3c24xx_leds_init);
module_exit(s3c24xx_leds_exit);
/* 描述驅動程式的一些資訊,不是必須的 */
module_author("");
module_version("0.1.0");
module_description("s3c2410/s3c2440 led driver");
module_license("gpl");
#include #include #include #include /*
* ledtest */
void print_usage(char *file)
int main(int argc, char **argv)
filename = argv[1];
fd = open(filename, o_rdwr);
if (fd < 0)
if (!strcmp("on", argv[2]))
else if (!strcmp("off", argv[2]))
else
return 0;
}
LED字元裝置驅動
一 實驗環境 開發機環境 作業系統 ubuntu 10.10 交叉編譯環境 arm linux gcc 4.4.1,安裝位置 usr local arm 4.4.1 6410板子核心原始碼路徑 work linux 2.6.36.2 v1.05 目標板環境 ok6410 a linux2.6.36 ...
字元裝置驅動 Led
驅動檔案 使用linux3.2.81核心 include include include include include include include include include include include static struct class ledsdrv class 類結構體 st...
字元裝置驅動 LED型
字元驅動程式 對於led型別的字元裝置驅動函式編寫 1 建立乙個file operation結構體,裡面會有點燈操作的各個硬體操作函式 2 編寫乙個drv init 函式 3 要對drv init函式進行修飾為入口函式,告訴核心,載入驅動時進行掛接 4 有init函式,那麼也會有出口函式exit m...