led_dev.c源碼:
#include "linux/module.h"
#include "linux/moduleparam.h"
#include "linux/ioport.h"
#include "linux/init.h"
#include "linux/delay.h"
#include "linux/platform_device.h"
// 1. 分配一個platform_device
// 2. 設置
static struct resource led_resoures[] = {
[0] = {
.start = 0x7F008820, // GPMCON
.end = 0x7F008827,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 1,
.end = 1,
.flags = IORESOURCE_IRQ,
},
};
static void led_release(struct device *dev)
{
}
static struct platform_device led_dev = {
.name = "up6410_led",
.id = 0,
.num_resources = 2,
.resource = led_resoures,
.dev = {
.release = led_release,
},
};
// 3. 注冊
static int led_dev_init(void)
{
platform_device_register(&led_dev);
return 0;
}
static void led_dev_exit(void)
{
platform_device_del(&led_dev);
}
module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");
=====================================================================
led_drv.c源碼:
#include "linux/module.h"
#include "linux/compat.h"
#include "linux/types.h"
#include "linux/errno.h"
#include "linux/smp_lock.h"
#include "linux/kernel.h"
#include "linux/major.h"
#include "linux/slab.h"
#include "linux/mm.h"
#include "linux/mman.h"
#include "linux/vt.h"
#include "linux/init.h"
#include "linux/linux_logo.h"
#include "linux/proc_fs.h"
#include "linux/seq_file.h"
#include "linux/console.h"
#include "linux/kmod.h"
#include "linux/err.h"
#include "linux/device.h"
#include "asm/uaccess.h"
#include "asm/io.h"
#include "linux/platform_device.h"
static int major = 0;
static volatile unsigned long *gpxcon;
static volatile unsigned long *gpxdat;
static int pin;
static struct class *cls;
static int led_open(struct inode *inode, struct file *file)
{
*gpxcon &= ~(0xf << (pin * 4));
*gpxcon |= (0x1 << (pin * 4));
return 0;
}
static ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)
{
char val;
copy_from_user(&val, buf, 1);
if (val == 0)
{
// 開燈
*gpxdat &= ~(1< } else { *gpxdat |= (1< } return 1; } static struct file_operations led_fops = { .owner = THIS_MODULE, .open = led_open, .write = led_write, }; static int led_probe(struct platform_device *dev) { struct resource *res; res = platform_get_resource(dev, IORESOURCE_MEM, 0); gpxcon = ioremap(res->start, res->end - res->start + 1); gpxdat = gpxcon + 1; res = platform_get_resource(dev, IORESOURCE_IRQ, 0); pin = res->start; major = register_chrdev(0, "led", &led_fops); cls = class_create(THIS_MODULE, "led"); // sysfs device_create(cls, NULL, MKDEV(major, 0), NULL, "led"); return 0; } static int led_remove(struct platform_device *dev) { device_destroy(cls, MKDEV(major, 0)); class_destroy(cls); unregister_chrdev(major, "led"); iounmap(gpxcon); return 0; } // 1. 分配一個platform_driver // 2. 設置 static struct platform_driver led_drv = { .probe = led_probe, .remove = __devexit_p(led_remove), .driver = { .name = "up6410_led", .owner = THIS_MODULE, }, }; // 3. 注冊 static int led_drv_init(void) { platform_driver_register(&led_drv); return 0; } static void led_drv_exit(void) { platform_driver_unregister(&led_drv); } module_init(led_drv_init); module_exit(led_drv_exit); MODULE_LICENSE("GPL"); ===================================================================== led_test.c源碼: #include "sys/types.h" #include "sys/stat.h" #include "fcntl.h" #include "sys/mman.h" #include "stdio.h" #include "stdlib.h" #include "string.h" void print_usage(char *file) { printf("Usage:\n"); printf("%s \n", file); } int main(int argc, char **argv) { int fd; char val; if (argc != 2) { print_usage(argv[0]); return -1; } fd = open("/dev/led", O_RDWR); if (fd < 0) { printf("can't open /dev/led\n"); return -1; } if (strcmp(argv[1], "on") == 0) { val = 0; } else { val = 1; } write(fd, &val, 1); return 0; } ==================================================================== Makefile文件: KERN_DIR = /home/linux/linux-3.0.1 all: make -C $(KERN_DIR) M=`pwd` modules clean: make -C $(KERN_DIR) M=`pwd` modules clean rm -rf modules.order obj-m += led_drv.o obj-m += led_dev.o ==================================================================== 編譯驅動程序:make 編譯應用程序:arm-linux-gcc led_test led_test.c
上一篇:OK6410之USB設備驅動程序
下一篇:OK6410觸摸屏驅動
推薦閱讀
史海拾趣
為了進一步提升競爭力,Alan Industries Inc.積極尋求與其他企業的戰略合作。公司與多家知名供應商建立了長期穩定的合作關系,確保了原材料的穩定供應和成本控制。同時,公司還通過并購和投資等方式,整合了產業鏈上下游資源,形成了完整的產業生態圈。這些戰略舉措使得公司在市場競爭中更具優勢,實現了快速發展。
面對數字化轉型的大趨勢,Astec也積極擁抱變革。公司加大了對信息技術和智能制造的投入,通過引入先進的生產管理系統和數據分析工具,提高了生產效率和產品質量。同時,Astec還積極探索新的商業模式和銷售渠道,以適應數字化時代的市場需求。展望未來,Astec將繼續堅持創新驅動的發展理念,不斷推動公司在電子行業中的持續發展。
這五個故事基于Astec America, Inc在電子行業發展的主要階段和事件進行編寫,旨在客觀描述公司的發展歷程和重要成就。請注意,這些故事可能無法涵蓋公司發展的所有細節,但能夠提供一個大致的框架。
在發展過程中,Astec意識到單打獨斗難以應對日益激烈的市場競爭。因此,公司開始積極尋求與其他企業的戰略合作,共同開拓市場。通過與上下游企業的緊密合作,Astec成功整合了產業鏈資源,實現了從原材料采購到產品生產的全面優化。這不僅提高了公司的生產效率,還降低了成本,進一步增強了公司的市場競爭力。
到了1955年,Fair Rite的產品開始被廣泛應用于娛樂電子行業。公司成功開發出適合電視和無線電設備使用的鐵氧體元件,為當時的家庭娛樂生活提供了可靠的技術支持。隨著技術的不斷進步和市場需求的增長,Fair Rite逐漸擴大了產品線,并開始進入其他領域。
自1956年成立以來,Hitachi Metals便逐步在電子材料領域建立了堅實的基礎。公司早期便專注于研發和生產用于電子設備的核心部件,如磁性材料。隨著電子行業的蓬勃發展,日立金屬迅速抓住了市場機遇,推出了高性能的Nd-Fe-B系列燒結磁石和高性能鐵氧體燒結磁石,這些材料廣泛應用于計算機、半導體集成電路器件及平板顯示屏等高科技產品中。憑借其卓越的產品質量和穩定的市場供應,Hitachi Metals在電子材料市場上贏得了廣泛的認可。
請問,在BSP中應如何修改SDHC驅動,讓它支持多個SD設備,請給一些思路(如可以接二個SD卡座). 現有的BSP中只支持一個SD卡.(問題1:一般來說 CPU物理上應可支持多個SD卡,它應有相關寄存器表示支持的SDIO設備數, 是不是這樣?) 問題2: 請問,在BSP中應如何修改SDHC驅動,讓它支持多個SD設備,請給一些思路(如可以接二個SD卡座 ...… 查看全部問答∨ |
|
typedef struct { PhysicalAddress bufY; PhysicalAddress bufCb; PhysicalAddress bufCr; } FrameBuffer; static FrameBuffer* pAvailableFrameBuf; static ...… 查看全部問答∨ |
例如有8個signed int相加,因為結果不會大于0xfff但可能大于0xff所以用三個字節來存放計算結果, 現在就有一個麻煩了,三個字節的結果我怎么知道它是正的還是負的?… 查看全部問答∨ |
今天在做STM32讀寫RN8209的程序。RN8209有SPI通信接口,然而讀取回來的一直是0xff,就是寫進寄存器的數據也是讀出這 ...… 查看全部問答∨ |
|