linux 按键 驱动?win7键盘驱动下载

Linux驱动程序开发实例的目录

前言

第1章 Linux设备驱动程序模型 1

1.1设备驱动程序基础 1

1.1.1驱动程序的概念 1

1.1.2驱动程序的加载方式 2

1.1.3编写可加载模块 3

1.1.4带参数的可加载模块 5

1.1.5设备驱动程序的分类 6

1.2字符设备驱动程序原理 7

1.2.1 file_operations结构 7

1.2.2使用register_chrdev注册字符

设备 9

1.2.3使用cdev_add注册字符设备 11

1.2.4字符设备的读写 13

1.2.5 ioctl接口 14

1.2.6 seek接口 16

1.2.7 poll接口 18

1.2.8异步通知 22

1.3 proc文件系统 24

1.3.1 proc文件系统概述 24

1.3.2 seq_file机制 25

1.3.3使用proc文件系统 27

1.4块设备驱动程序 32

1.4.1 Linux块设备驱动程序原理 32

1.4.2简单的块设备驱动程序实例 35

1.5网络设备驱动程序 39

1.5.1网络设备的特殊性 39

1.5.2 sk_buff结构 40

1.5.3 Linux网络设备驱动程序架构 42

1.5.4虚拟网络设备驱动程序实例 46

1.6 Linux 2.6设备管理机制 50

1.6.1 kobject和kset 50

1.6.2 sysfs文件系统 51

1.6.3设备模型层次 52

1.6.4 platform的概念 54

第2章 Linux内核同步机制 58

2.1锁机制 58

2.1.1自旋锁 58

2.1.2读写锁 60

2.1.3 RCU 61

2.2互斥 64

2.2.1原子操作 64

2.2.2信号量 65

2.2.3读写信号量 67

2.3等待队列 68

2.3.1等待队列原理 68

2.3.2阻塞式I/O实例 68

2.3.3完成事件 70

2.4关闭中断 71

第3章内存管理与链表 72

3.1物理地址和虚拟地址 72

3.2内存分配与释放 72

3.3 IO端口到虚拟地址的映射 73

3.3.1静态映射 73

3.3.2动态映射 75

3.4内核空间到用户空间的映射 76

3.4.1内核空间到用户空间的地址

映射原理 76

3.4.2 mmap地址映射实例 78

3.5内核链表 80

3.5.1 Linux内核中的链表 80

3.5.2内核链表实例 81

第4章延迟处理 83

4.1内核线程 83

4.2软中断机制 85

4.2.1软中断原理 85

4.2.2 tasklet 87

4.3工作队列 89

4.3.1工作队列原理 89

4.3.2工作队列实例 91

4.4内核时间 92

4.4.1 Linux中的时间概念 92

4.4.2 Linux中的延迟 93

4.4.3内核定时器 93

第5章简单设备驱动程序 96

5.1寄存器访问 96

5.1.1 S3C6410地址映射 96

5.1.2 S3C6410看门狗驱动程序实例 98

5.1.3 S3C6410蜂鸣器驱动程序实例 102

5.2电平控制 107

5.2.1 S3C6410 LED驱动程序实例 107

5.2.2扫描型S3C6410按键驱动

程序实例 109

5.3时序产生 112

5.3.1时序图原理 112

5.3.2 AT24C02芯片原理 112

5.3.3 AT24C02驱动程序开发实例 115

5.4硬中断处理 123

5.4.1硬中断处理原理 123

5.4.2中断型S3C6410按键驱动

程序实例 127

5.5 Linux I/O端口控制 132

5.5.1 Linux I/O端口读写 132

5.5.2在应用层访问Linux I/O

端口 133

5.5.3/dev/port设备 134

第6章深入Linux内核 135

6.1嵌入式Linux系统构成 135

6.2 Linux内核导读 136

6.2.1 Linux内核组成 136

6.2.2 Linux的代码结构 137

6.2.3内核Makefile 138

6.2.4 S3C6410硬件初始化 139

6.3 Linux文件系统 141

6.3.1虚拟文件系统 141

6.3.2根文件系统 143

6.3.3文件系统加载 143

6.3.4 ext3文件系统 145

6.4 Flash文件系统 145

6.4.1 MTD设备 145

6.4.2 MTD字符设备 148

6.4.3 MTD块设备 150

6.4.4 cramfs文件系统 153

6.4.5 JFFS2文件系统 153

6.4.6 YAFFS文件系统 155

6.4.7文件系统总结 156

6.5 Linux内核移植 156

6.5.1体系配置 156

6.5.2添加yaffs2 157

6.5.3 Nand flash驱动程序移植 157

6.5.4配置启动参数 159

6.5.5移植RTC驱动程序 160

6.6根文件系统制作 162

6.6.1 Busybox 162

6.6.2 shell基础 165

6.6.3根文件系统构建实例 166

6.7 udev模型 167

6.7.1 udev模型原理 167

6.7.2 mdev的使用 167

第7章 I2C总线驱动程序 169

7.1 Linux的I2C驱动程序架构 169

7.1.1 I2C适配器 169

7.1.2 I2C算法 170

7.1.3 I2C驱动程序结构 170

7.1.4 I2C从设备 171

7.1.5 i2c-dev设备层 171

7.2 Linux I2C驱动程序开发 174

7.2.1 S3C2410X的I2C控制器 174

7.2.2 S3C2410X的I2C驱动程序

分析 175

7.3 S3C2410的I2C访问实例 182

7.4 I2C客户端驱动程序 185

第8章 TTY与串口驱动程序 190

8.1 TTY概念 190

8.2 Linux TTY驱动程序体系 190

8.2.1 TTY驱动程序调用关系 190

8.2.2 TTY驱动程序原理 191

8.3线路规程 194

8.4串口驱动程序与TTY 196

8.4.1串口设备驱动程序原理 196

8.4.2 S3C6410的串口驱动程序

实例 199

8.5 TTY应用层 202

第9章网络设备驱动程序 205

9.1 DM9000网卡驱动程序

开发 205

9.1.1 DM9000原理 205

9.1.2 DM9000X驱动程序分析 207

9.1.3 DM9000网口驱动程序移植 215

9.2 NFS根文件系统搭建 219

9.2.1主机配置 219

9.2.2 NFS根文件系统搭建实例 220

9.3 netlink Socket 224

9.3.1 netlink机制 224

9.3.2 netlink应用层编程 228

9.3.3 netlink驱动程序实例 229

第10章 framebuffer驱动程序 232

10.1 Linux framebuffer驱动

程序原理 232

10.1.1 framebuffer核心数据结构 232

10.1.2 framebuffer操作接口 234

10.1.3 framebuffer驱动程序的文件

接口 236

10.1.4 framebuffer驱动程序框架 236

10.2 S3C6410显示控制器 238

10.3 S3C6410 LCD驱动程序实例 243

10.4 framebuffer应用层 250

10.5 Qt4界面系统移植 251

第11章输入子系统驱动程序 253

11.1 Linux输入子系统概述 253

11.1.1 input_dev结构 253

11.1.2输入事件 255

11.2 input_handler 256

11.2.1 Input Handler层 256

11.2.2常用的Input Handler 259

11.3输入设备应用层 261

11.4键盘输入设备驱动程序

实例 262

11.5 event接口 267

11.6触摸屏驱动程序实例 270

11.6.1 S3C6410触摸屏控制器 270

11.6.2 S3C6410触摸屏驱动程序

设计 273

11.7触摸屏校准 282

11.7.1触摸屏校准原理 282

11.7.2利用TSLIB库校准触摸屏 282

第12章 USB驱动程序 284

12.1 USB体系概述 284

12.1.1 USB系统组成 284

12.1.2 USB主机 284

12.1.3 USB设备逻辑层次 285

12.2 Linux USB驱动程序体系 287

12.2.1 USB总体结构 287

12.2.2 USB设备驱动程序 287

12.2.3主机控制器驱动程序 288

12.2.4 USB请求块urb 289

12.2.5 USB请求块的填充 291

12.3 S3C6410 USB主机控制器

驱动程序 292

12.3.1 USB主机控制器驱动程序

分析 292

12.3.2 S3C6410 USB驱动程序

加载 294

12.4 USB键盘设备驱动程序

分析 296

12.5 USB Gadget驱动程序 301

12.5.1 Linux USB Gadget驱动程序 301

12.5.2 Linux USB Gadget驱动程序

实例 302

第13章音频设备驱动程序 303

13.1 ALSA音频体系 303

13.2 ALSA驱动层API 304

13.2.1声卡和设备管理 304

13.2.2 PCM API 304

13.2.3控制与混音API 305

13.2.4 AC97 API 306

13.2.5 SOC层驱动 307

13.3 ALSA驱动程序实例 308

13.3.1 S3C6410的AC97控制

单元 308

13.3.2 S3C6410声卡电路原理 309

13.3.3 S3C6410的数字音频接口 310

13.3.4 wm9713的数字音频接口 313

13.4 ALSA音频编程接口 316

13.4.1 ALSA PCM接口实例 316

13.4.2 ALSA MIDI接口实例 320

13.4.3 ALSA mixer接口实例 321

13.4.4 ALSA timer接口实例 322

第14章 video4linux2视频

驱动程序 327

14.1 video4linux2驱动程序

架构 327

14.1.1 video4linux2驱动程序的

注册 327

14.1.2 v4l2_fops接口 331

14.1.3常用的结构 332

14.1.4 video4linux2的ioctl函数 333

14.2 S3C6410摄像头驱动程序

分析 333

14.2.1电路原理 333

14.2.2驱动程序分析 334

14.3 video4linux2应用层实例 339

第15章 SD卡驱动程序 346

15.1 Linux SD卡驱动程序体系 346

15.1.1 SD卡电路原理 346

15.1.2 MMC卡驱动程序架构 347

15.1.3 MMC卡驱动程序相关

结构 347

15.1.4 MMC卡块设备驱动程序 350

15.1.5 SD卡主机控制器接口驱动

程序 356

15.2 S3C6410 SD卡控制器驱动

程序分析 360

15.2.1电路原理 360

15.2.2 S3C6410 SDHCI驱动

程序原理 360

15.2.3 SD卡的加载实例 364

参考文献 366

linux下如何模拟按键输入和模拟鼠标

linux/input.h中有定义,这个文件还定义了标准按键的编码等 struct input_event{ struct timeval time;//按键时间 __u16 type;//类型,在下面有定义 __u16 code;//要模拟成什么按键 __s32 value;//是按下还是释放}; code:事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码,0x110~0x116为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看 include/linux/input.h文件.如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向REL_X(代码为0x00),指示鼠标的Y轴方向REL_Y(代码为0x01),指示鼠标中轮子方向 REL_WHEEL(代码为0x08). type: EV_KEY,键盘 EV_REL,相对坐标 EV_ABS,绝对坐标 value:事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是 EV_ REL,value的正数值和负数值分别代表两个不同方向的值./** Event types*/#define EV_SYN 0x00#define EV_KEY 0x01//按键#define EV_REL 0x02//相对坐标(轨迹球)#define EV_ABS 0x03//绝对坐标#define EV_MSC 0x04//其他#define EV_SW 0x05#define EV_LED 0x11//LED#define EV_SND 0x12//声音#define EV_REP 0x14//repeat#define EV_FF 0x15#define EV_PWR 0x16#define EV_FF_STATUS 0x17#define EV_MAX 0x1f#define EV_CNT(EV_MAX+1) 1。模拟按键输入//其中0表示释放,1按键按下,2表示一直按下//0 for EV_KEY for release, 1 for keypress and 2 for autorepeat. void simulate_key(int fd,int value){ struct input_event event; event.type= EV_KEY;//event.code= KEY_0;//要模拟成什么按键 event.value= value;//是按下还是释放按键或者重复 gettimeofday(&event.time,0); if(write(fd,&event,sizeof(event))< 0){ dprintk("simulate key error~~~\n"); return;}} 2。模拟鼠标输入(轨迹球) void simulate_mouse(int fd,char buf[4]){ int rel_x,rel_y; static struct input_event event,ev;//buf[0],buf[2],小于0则为左移,大于0则为右移//buf[1],buf[3],小于0则为下移,大于0则为上移 dprintk("MOUSE TOUCH: x1=%d,y1=%d,x2=%d,y2=%d\n",buf[0],buf[1],buf[2],buf[3]); rel_x=(buf[0]+ buf[2])/2; rel_y=-(buf[1]+ buf[3])/2;//和我们的鼠标是相反的方向,所以取反 event.type= EV_REL; event.code= REL_X; event.value= rel_x; gettimeofday(&event.time,0); if( write(fd,&event,sizeof(event))!=sizeof(event)) dprintk("rel_x error~~~:%s\n",strerror(errno)); event.code= REL_Y; event.value= rel_y; gettimeofday(&event.time,0); if( write(fd,&event,sizeof(event))!=sizeof(event)) dprintk("rel_y error~~~:%s\n",strerror(errno));//一定要刷新空的 write(fd,&ev,sizeof(ev));}鼠标和键盘文件打开方法: int fd_kbd;///dev/input/event1 int fd_mouse;//dev/input/mouse2 fd_kbd= open("/dev/input/event1",O_RDWR); if(fd_kbd<=0){ printf("error open keyboard:%s\n",strerror(errno)); return-1;} fd_mouse= open("/dev/input/event3",O_RDWR);//如果不行的话,那试试/dev/input/mice if(fd_mouse<=0){ printf("error open mouse:%s\n",strerror(errno)); return-2;}}/dev/input/mice是鼠标的抽象,代表的是鼠标,也许是/dev/input/mouse,/dev/input/mouse1,或者空,这个文件一直会存在。这里你也许会问,我怎么知道/dev/input/eventX这些事件到底是什么事件阿,是鼠标还是键盘或者别的, eventX代表的是所有输入设备(input核心)的事件,比如按键按下,或者鼠标移动,或者游戏遥控器等等,在系统查看的方法是 cat/proc/bus/input/devices就可以看到每个eventX是什么设备的事件了。 PS:在GTK中用的话,可以参考下gtk_main_do_event这个函数 static void simulate_key(GtkWidget*window,int keyval,int press){ GdkEvent*event; GdkEventType type; if(press) type= GDK_KEY_PRESS; else type= GDK_KEY_RELEASE; event= gdk_event_new(type);//event->key.send_event= TRUE; event->key.window= window->window;//一定要设置为主窗口 event->key.keyval= keyval;//FIXME:一定要加上这个,要不然容易出错 g_object_ref(event->key.window); gdk_threads_enter();//FIXME:记得用这个来发送事件 gtk_main_do_event(event); gdk_threads_leave(); gdk_event_free(event);} kernel里input模块 input_dev结构: struct input_dev{ void*private; const char*name; const char*phys; const char*uniq; struct input_id id;/**根据各种输入信号的类型来建立类型为unsigned long的数组,*数组的每1bit代表一种信号类型,*内核中会对其进行置位或清位操作来表示时间的发生和被处理.*/ unsigned long evbit[NBITS(EV_MAX)]; unsigned long keybit[NBITS(KEY_MAX)]; unsigned long relbit[NBITS(REL_MAX)]; unsigned long absbit[NBITS(ABS_MAX)]; unsigned long mscbit[NBITS(MSC_MAX)]; unsigned long ledbit[NBITS(LED_MAX)]; unsigned long sndbit[NBITS(SND_MAX)]; unsigned long ffbit[NBITS(FF_MAX)]; unsigned long swbit[NBITS(SW_MAX)];.........................................};/*** input_set_capability- mark device as capable of a certain event*@dev: device that is capable of emitting or accepting event*@type: type of the event(EV_KEY, EV_REL, etc...)*@code: event code** In addition to setting up corresponding bit in appropriate capability* bitmap the function also adjusts dev->evbit.*//*记录本设备对于哪些事件感兴趣(对其进行处理)*/ void input_set_capability(struct input_dev*dev, unsigned int type, unsigned int code){ switch(type){ case EV_KEY: __set_bit(code, dev->keybit);//比如按键,应该对哪些键值的按键进行处理(对于其它按键不予理睬) break; case EV_REL: __set_bit(code, dev->relbit); break; case EV_ABS: __set_bit(code, dev->absbit); break; case EV_MSC: __set_bit(code, dev->mscbit); break; case EV_SW: __set_bit(code, dev->swbit); break; case EV_LED: __set_bit(code, dev->ledbit); break; case EV_SND: __set_bit(code, dev->sndbit); break; case EV_FF: __set_bit(code, dev->ffbit); break; default: printk(KERN_ERR"input_set_capability: unknown type%u(code%u)\n", type, code); dump_stack(); return;} __set_bit(type, dev->evbit);//感觉和前面重复了(前面一经配置过一次了)} EXPORT_SYMBOL(input_set_capability); static irqreturn_t gpio_keys_isr(int irq, void*dev_id){ int i; struct platform_device*pdev= dev_id; struct gpio_keys_platform_data*pdata= pdev->dev.platform_data; struct input_dev*input= platform_get_drvdata(pdev); for(i= 0; i< pdata->nbuttons; i++){ struct gpio_keys_button*button=&pdata->buttons[i]; int gpio= button->gpio; if(irq== gpio_to_irq(gpio)){//判断哪个键被按了? unsigned int type= button->type?: EV_KEY; int state=(gpio_get_value(gpio)? 1: 0) ^ button->active_low;//记录按键状态 input_event(input, type, button->code,!!state);//汇报输入事件 input_sync(input);//等待输入事件处理完成}} return IRQ_HANDLED;}/** input_event()- report new input event*@dev: device that generated the event*@type: type of the event*@code: event code*@value: value of the event** This function should be used by drivers implementing various input devices* See also input_inject_event()*/ void input_event(struct input_dev*dev, unsigned int type, unsigned int code, int value){ struct input_handle*handle; if(type> EV_MAX||!test_bit(type, dev->evbit))//首先判断该事件类型是否有效且为该设备所接受 return; add_input_randomness(type, code, value); switch(type){ case EV_SYN: switch(code){ case SYN_CONFIG: if(dev->event) dev->event(dev, type, code, value); break; case SYN_REPORT: if(dev->sync) return; dev->sync= 1; break;} break; case EV_KEY:/**这里需要满足几个条件:* 1:键值有效(不超出定义的键值的有效范围)* 2:键值为设备所能接受(属于该设备所拥有的键值范围)* 3:按键状态改变了*/ if(code> KEY_MAX||!test_bit(code, dev->keybit)||!!test_bit(code, dev->key)== value) return; if(value== 2) break; change_bit(code, dev->key);//改变对应按键的状态/*如果你希望按键未释放的时候不断汇报按键事件的话需要以下这个(在简单的gpio_keys驱动中不需要这个,暂时不去分析)*/ if(test_bit(EV_REP, dev->evbit)&& dev->rep[REP_PERIOD]&& dev->rep[REP_DELAY]&& dev->timer.data&& value){ dev->repeat_key= code; mod_timer(&dev->timer, jiffies+ msecs_to_jiffies(dev->rep[REP_DELAY]));} break;........................................................ if(type!= EV_SYN) dev->sync= 0; if(dev->grab) dev->grab->handler->event(dev->grab, type, code, value); else/**循环调用所有处理该设备的handle(event,mouse,ts,joy等),*如果有进程打开了这些handle(进行读写),则调用其对应的event接口向气汇报该输入事件.*/ list_for_each_entry(handle,&dev->h_list, d_node) if(handle->open) handle->handler->event(handle, type, code, value);} EXPORT_SYMBOL(input_event); event层对于input层报告的这个键盘输入事件的处理: drivers/input/evdev.c: static struct input_handler evdev_handler={.event= evdev_event,.connect= evdev_connect,.disconnect= evdev_disconnect,.fops=&evdev_fops,.minor= EVDEV_MINOR_BASE,.name="evdev",.id_table= evdev_ids,}; Linux有自己的 input子系统,可以统一管理鼠标和键盘事件。基于输入子系统实现的 uinput可以方便的在用户空间模拟鼠标和键盘事件。当然,也可以自己造轮子,做一个字符设备接收用户输入,根据输入,投递 input事件。还有一种方式就是直接往 evnent里写入数据,都可以达到控制鼠标键盘的功能。本篇文章就是演示直接写入 event的方法。 linux/input.h中有定义,这个文件还定义了标准按键的编码等 struct input_event{ struct timeval time;//按键时间 __u16 type;//类型,在下面有定义 __u16 code;//要模拟成什么按键 __s32 value;//是按下还是释放}; code:事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码, 0x110~0x116为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看 include/linux/input.h文件.如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向 REL_X(代码为0x00),指示鼠标的Y轴方向REL_Y(代码为0x01),指示鼠标中轮子方向 REL_WHEEL(代码为0x08). type: EV_KEY,键盘 EV_REL,相对坐标 EV_ABS,绝对坐标 value:事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是 EV_ REL,value的正数值和负数值分别代表两个不同方向的值./** Event types*/#define EV_SYN 0x00#define EV_KEY 0x01//按键#define EV_REL 0x02//相对坐标(轨迹球)#define EV_ABS 0x03//绝对坐标#define EV_MSC 0x04//其他#define EV_SW 0x05#define EV_LED 0x11//LED#define EV_SND 0x12//声音#define EV_REP 0x14//repeat#define EV_FF 0x15#define EV_PWR 0x16#define EV_FF_STATUS 0x17#define EV_MAX 0x1f#define EV_CNT(EV_MAX+1)下面是一个模拟鼠标和键盘输入的例子:#include#include#include#include#include#include#include#include#include#include#include void simulate_key(int fd,int kval){ struct input_event event; event.type= EV_KEY; event.value= 1; event.code= kval; gettimeofday(&event.time,0); write(fd,&event,sizeof(event)); event.type= EV_SYN; event.code= SYN_REPORT; event.value= 0; write(fd,&event, sizeof(event)); memset(&event, 0, sizeof(event)); gettimeofday(&event.time, NULL); event.type= EV_KEY; event.code= kval; event.value= 0; write(fd,&event, sizeof(event)); event.type= EV_SYN; event.code= SYN_REPORT; event.value= 0; write(fd,&event, sizeof(event));} void simulate_mouse(int fd){ struct input_event event; memset(&event, 0, sizeof(event)); gettimeofday(&event.time, NULL); event.type= EV_REL; event.code= REL_X; event.value= 10; write(fd,&event, sizeof(event)); event.type= EV_REL; event.code= REL_Y; event.value= 10; write(fd,&event, sizeof(event)); event.type= EV_SYN; event.code= SYN_REPORT; event.value= 0; write(fd,&event, sizeof(event));} int main(){ int fd_kbd; int fd_mouse; fd_kbd= open("/dev/input/event1",O_RDWR); if(fd_kbd<=0){ printf("error open keyboard:\n"); return-1;} fd_mouse= open("/dev/input/event2",O_RDWR); if(fd_mouse<=0){ printf("error open mouse\n"); return-2;} int i= 0; for(i=0; i< 10; i++){ simulate_key(fd_kbd, KEY_A+ i); simulate_mouse(fd_mouse); sleep(1);} close(fd_kbd);}模拟了鼠标和键盘的输入事件。

如何配置编译在mini2440开发板上运行的linux内核

参考:

系统ubuntu12.04(非虚拟机下)

mini2440

CPU型号: S3C2440AL-40

Nanflash型号:K9F1G08

Norflash型号:SST39VF1601

LCD:统宝 240 x 320

$:普通账户

#:root账户

*当shell下输入路径时可使用tab键自动补全

(一)建立交叉编译环境

1.将mini2440光盘中的linux文件夹拷贝到/home/lianghuiyong并改名为Linux_share

(其中两个文档为我后面添加进去的)

2.Ctrl+Alt+T打开shell

3.$ su- root(切换root权限)

4.# cd/home/lianghuiyong/Linux_share

5.解压安装arm-linux-gcc编辑器

# tar xvzf arm-linux-gcc-4.4.3.tar.gz–C///注意:C后面有个空格

执行该命令,将把 arm-linux-gcc安装到/usr/loca/arm/4.4.3目录。这句来自mini2440用户手册,我发现其实是安装到/opt/FriendlyARM/toolchain/4.4.3目录

6.# vim/root/.bashrc

7.在最后一行添加:export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin//opt/FriendlyARM/toolschain/4.4.3/bin为arm-linux-gcc环境变量

:wq保存退出。

# source~/.bashrc

8.# sudo gedit/etc/environment

games后面添加标记部分

9.# arm-linux-gcc-v//gcc后面有空格

测试hello.c(这是在安装了第二部分的linux示例程序才有examples/hello目录)

# cd/opt/FriendlyARM/mini2440/examples/hello

# arm-linux-gcc-o hello hello.c

#./hello

(二)安装源代码及其他工具

创建工作目录(以下都为root环境下):

# mkdir-p/opt/FriendlyARM/mini2440

1>>解压安装linux内核源代码

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/linux-2.6.32.2-mini2440-20100106.tar.gz

2>>解压安装嵌入式图形系统qtopia源代码

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/x86-qtopia.tgz

# tar xvzf/home/lianghuiyong/Linux_share/arm-qtopia.tgz

3>>解压安装嵌入式图形系统 QtE-4.6.1源代码

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/arm-qte-4.6.3-20100802.tar.gz

4>>解压安装busybox源代码

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/busybox-1.13.3-mini2440.tgz

5>>解压安装 Linux示例程序

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/examples-20100108.tgz

6>>解压安装 vboot源代码

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/vboot-src-20100106.tar.gz

7>>解压安装 bootloader源代码

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/bootloader.tgz

8>>解压创建目标文件系统

# cd/opt/FriendlyARM/mini2440

#tar xvzf/home/lianghuiyong/Linux_share/rootfs_qtopia_qt4-20100816.tar.gz

9>>解压安装目标文件系统映象制作工具 mkyaffs2image

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/mkyaffs2image.tgz–C/

10>>解压安装LogoMaker

# cd/opt/FriendlyARM/mini2440

# tar xvzf/home/lianghuiyong/Linux_share/logomaker.tgz–C/

(三)定制linux内核及制作文件系统

config_mini2440_x35–适用于 Sony 3.5” LCD的内核配置文件

config_mini2440_t35–适用于统宝 3.5” LCD的内核配置文件

config_mini2440_l80–适用于 Sharp 8” LCD(或兼容)的内核配置文件

config_mini2440_n35–适用于 NEC3.5” LCD的内核配置文件

config_mini2440_h43–适用于 4.3” LCD的内核配置文件

config_mini2440_a70–适用于群创 7” LCD的内核配置文件

config_mini2440_vga1024x768–适用于 VGA显示输出(分辨率 1024x768)模块的内核

配置文件

1.配置缺省文件config_t35(统宝240x320)

# cd/opt/FriendlyARM/mini2440/linux-2.6.32.2

# cp config_mini2440_t35.config

# make menuconfig

出现界面

不做更改,exit退出。这样做是为了生成相应配置(统宝240x320)的头文件。

2.编译内核

在/opt/FriendlyARM/mini2440/linux-2.6.32.2目录下编译内核

#make zImage

编译结束后,会在 arch/arm/boot目录下生成 linux内核映象文件:zImage(zImage可下载到开发板测试)

3.定制linux内核(根据用户手册来走一遍)

# cd/opt/FriendlyARM/mini2440/linux-2.6.32.2

# make menuconfig

出现配置选项:

3.1配置cpu

主菜单-->System--> Type S3C2400 Machines--> FriendlyARM Mini2440 development board

3.2配置lcd驱动

主菜单-->Device Drivers-->Graphics support-->Support for frame buffer devices-->Backlight-->LCD select-->3.5 inch 240x320 Toppoly LCD

3.3配置触摸屏

主菜单-->Device Drivers-->Input device support-->Touchscreens-->Samsung s3c24410 touchscreen input driver

3.4配置usb鼠标和键盘

主菜单-->Device Drivers-->hid devices-->USB Human interface Device

3.5配置优盘

主菜单-->Device Drivers-->SCSI device support--> SCSI disk

3.6配置万能驱动USB摄像头

主菜单-->Device Drivers-->Multimedia devices-->Video capture adapters-->V4L USB devices-->GSPCA based webcams-->ALi USB m 5602 Camera Driver

3.7配置CMOS摄像头驱动

主菜单-->Device Drivers-->Multimedia devices-->Video capture adapters-->OV9650 on the s3c2440 driver

3.8配置网卡驱动

主菜单-->Netwoking support-->Networking options-->选择Unix和TCP/IP

主菜单-->Device Drivers-->Network device support-->Ethernet(10 or 100Mbit)-->

选择<*> Generic Media Independent Interface device support

<*> DM9000 support

3.9配置USB无线网卡驱动

主菜单-->Netwoking support-->wireless-->IEEE 802.11

主菜单-->Device Drivers-->Netwoking device support-->wireless LAN-->Wireless LAN(IEEE 802.11)-->Ralink driver support-->

3.10配置音频驱动

主菜单-->Device Drivers-->Sound card supprt-->OSS Mixer API-->ALSA for Soc audio support-->SoC Audio for the samsung S3Cxxxx Chips

3.11配置SD/MMC卡驱动

主菜单-->Device Drivers-->MMC/SD/SDIO card-->samsung S3C SD/MMC card

3.12配置看门狗驱动支持

主菜单-->Device Drivers-->Watchdog Timer-->s3c2440 Watchdog

3.13配置LED驱动

主菜单-->Device Drivers-->Character devices-->LED support for Mini2440

3.14配置按键驱动

主菜单-->Device Drivers-->Character devices-->Buttons driver

3.15配置PWM控制蜂鸣器驱动

主菜单-->Device Drivers-->Character devices-->buzzer driver for

3.16配置AD转换驱动

主菜单-->Device Drivers-->Character devices-->ADC driver for

3.17配置串口驱动

主菜单-->Device Drivers-->Character devices-->Serial drivers-->samsung S3C2440/S3C2442

3.18如何配置RTC实时时钟驱动

主菜单-->Device Drivers-->Real Time Clock-->samsung S3C series SoC RTC

3.19配置I2C-EEPROM驱动支持

主菜单-->Device Drivers-->I2C support-->I2C Hardware Bus support-->S3C2410 I2C Driver

3.20配置yaff2s文件系统的支持

主菜单-->Device Drivers-->MTD-->NAND Device Support-->NAND FLASH Support

主菜单-->File systems-->Miscellaneous filesystems-->YAFFS2 file system support

3.21配置EXT2/VFAT/ NFS等文件系统

主菜单-->File systems-->Network File Systems-->root file system on NFS

为了支持FAT32文件系统.

主菜单-->File systems-->DOS/FAT/NT Filesystems-->VFAT(windows-95) fs support

关于mini2440 linux内核裁剪到此为止,退出后有一个是否保存提示,选择保存!

3.22制作Linux logo

本来想使用Logomaker,结果生成的图片都是无数据的,这可能和系统内一些参数有关

使用命令方式制作logo:

在图片(open_show.png)目录下

# pngtopnm open_show.png> temp.ppm

# ppmquant 224 temp.ppm>temp2.ppm

# pnmnoraw temp2.ppm> logo.ppm

将目录下生成的logo.ppm改成linux_logo_clut224.ppm,替代linux2.6.32.2/drivers/video/logo目录下的同名文件

阅读剩余
THE END