开发者

embedded linux, how to switch the use of the serial port at the push of a button?

I am a business programmer with a few years of Linux administration experience. I'm starting out in embedded Linux. Yesterday, we were discussing a new device design and I was asked a few questions I had no answers for.

The engineers want to have some push buttons on an electronic board with a serial port on it. The OS is Linux.

Normally, when a user will connect to the serial port, a protocol will answer him instead of a Linux login prompt. However, if he pushes a sequence of buttons on the device, a Linux prompt will answer him on the serial port instead.

The Linu开发者_运维问答x driver to handle the push button interrupt handling aside, how can you switch the basic use of the serial port like that? Does anyone have a URL reference on how to do this? (preferably with some sample code)

Note: I proposed providing a nice menu on login for a given user, but no can do.

Thanks in advice for any suggestions.

Best regards, Bert


The main problem is that the process that implements your device protocol is probably keeping the serial port open.

In this case you should probably:

  1. Wait for the button event

  2. Have the protocol process close the serial port - terminating that process completely might also do for you

  3. Launch a *getty process - or whatever your embedded target uses to present a login prompt on the serial port

  4. Restore the protocol process once you are done

EDIT:

In the steps above I assume the more common case where the process that controls the serial port (e.g. pppd) is not able to act as a getty substitute to provide a login prompt. It is also typically not the same process that provides telnet/SSH/whatever logins.

That said, it's quite possible on a customised embedded Linux system for a process to do more than one thing. In that case you have to configure or modify that process to switch operational modes when appropriate.

Without more information about your embedded target it's impossible to provide a more specific answer.


The getty process is usually started on serial ports to provide a login prompt by /sbin/init, which is configured in /etc/inittab.

init has the concept of "runlevels". Each runlevel defines a separate set of processes that init will keep running. One elegant way to implement this would be to design your "protocol" process so that it is started by init, in the same way as getty. You can then tell init to run your process in some runlevels, and getty in others, and have the pushbutton switch between runlevels. For example, your /etc/inittab might include:

T0:2:respawn:/sbin/getty -L ttyS0 9600 vt100
P0:345:respawn:/sbin/protocol ttyS0 9600

This will run your protocol command on the first serial port in runlevels 3, 4 and 5; but getty in runlevel 2.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜