TTY之struct console

console是个控制端口,这当然也是一个串口。这里我们利用struct console描述串口驱动,
struct console实例来把kernel log导出。当然这里侧重描述其数据处理。
这类设备可以进行读写。读一般是指从硬件读取数据,然后把数据分发到相应的进程中去。而写则是把内核一些log
通过硬件传递给客户。
串口设备驱动描述:
struct console {
 char name[16];
 void (*write)(struct console *, const char *, unsigned);
 int (*read)(struct console *, char *, unsigned);
 struct tty_driver *(*device)(struct console *, int *);
 void (*unblank)(void);
 int (*setup)(struct console *, char *);
 int (*match)(struct console *, char *name, int idx, char *options);
 short flags;
 short index;
 int cflag;
 void *data;
 struct  console *next;
};
 
当然对象console是通过函数register_console()注册,而unregister_console()则进行注销操作。
所有的console通过next链接起来。宏for_each_console()可以对所有注册的console迭代。
 
/*
 * for_each_console() allows you to iterate on each console
 */
#define for_each_console(con) \
 for (con = console_drivers; con != NULL; con = con->next)
所有的console以console_drivers为头,并console_sem保护。
static DEFINE_SEMAPHORE(console_sem);
struct console *console_drivers;
EXPORT_SYMBOL_GPL(console_drivers);
 
如果想独占使用console,则可以调用函数console_lock()锁住console,使用函数console_unlock()解锁。
或者尝试性使用console_trylock()获取锁。成功获取锁的标识是console_locked被设置为1.当然在系统suspend时候
是不允许持有这个console_locked的。而console_suspended是console是否Suspen和resume的标志,如果
console_suspended为真,说明系统处于suspend当中,这时获取console_locked时失败,不会设置
console_locked。
注意,获取锁也会设置console_sem信号量。
 

void console_lock(void) {  might_sleep();

 down_console_sem();  if (console_suspended)   return;  console_locked = 1;  console_may_schedule = 1; } EXPORT_SYMBOL(console_lock);

 
int console_trylock(void)
{
 if (down_trylock_console_sem())
  return 0;
 if (console_suspended) {
  up_console_sem();
  return 0;
 }
 console_locked = 1;
 console_may_schedule = !oops_in_progress &&
   preemptible() &&
   !rcu_preempt_depth();
 return 1;
}
EXPORT_SYMBOL(console_trylock);
 
int is_console_locked(void)
{
 return console_locked;
}
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值